﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Web.Mvc;
using System.Web.Security;
using System.Configuration;
using System.Text;
using System.IO;
using System.Web.UI;
using System.Web.Mvc.Html;
using System.Data;
using System.Drawing;
using myLibrary;
using System.Web.Helpers;

namespace myTutor.Models
{
    public partial class ClassTutorTransaction
    {
        //------------Class info----------------------------

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Tên người nhận gia sư")]
        public string CustomParentsName
        {
            get { return ParentsName; }
            set { ParentsName = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Giới tính")]
        public string CustomParentsGender
        {
            get { return ParentsGender; }
            set { ParentsGender = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [RegularExpression(@"[0-9]{4}", ErrorMessage = "{0} không đúng.")]
        [Display(Name = "Năm sinh")]
        public string CustomParentsBirthYear
        {
            get { return ParentsBirthYear; }
            set { ParentsBirthYear = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [DataType(DataType.PhoneNumber)]
        [RegularExpression(@"[0-9]{6,13}", ErrorMessage = "{0} phải là dãy số viết liền không cách, có độ dài từ 6 đến 13 ký số.")]
        [Display(Name = "Điện thoại")]
        public string CustomParentsMobiPhone
        {
            get { return ParentsMobiPhone; }
            set { ParentsMobiPhone = value; }
        }

        [DataType(DataType.EmailAddress)]
        [RegularExpression(@"^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$", ErrorMessage = "{0} không đúng.")]
        [Display(Name = "Email")]
        public string CustomParentsEmail
        {
            get { return ParentsEmail; }
            set { ParentsEmail = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Số nhà/phòng")]
        public string CustomParentsHouseNumber
        {
            get { return ParentsHouseNumber; }
            set { ParentsHouseNumber = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Tên đường")]
        public string CustomParentsStreet
        {
            get { return ParentsStreet; }
            set { ParentsStreet = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Tên phường")]
        public string CustomParentsWard
        {
            get { return ParentsWard; }
            set { ParentsWard = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Tên huyện/quận")]
        public int? CustomParentsDistrictId
        {
            get { return ParentsDistrictId; }
            set { ParentsDistrictId = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Tên tỉnh/thành phố")]
        public int? CustomParentsProvinceId
        {
            get { return ParentsProvinceId; }
            set { ParentsProvinceId = value; }
        }

        //------------Tutor info----------------------------

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Tên gia sư")]
        public string CustomTutorName
        {
            get { return TutorName; }
            set { TutorName = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Giới tính gia sư")]
        public string CustomTutorGender
        {
            get { return TutorGender; }
            set { TutorGender = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [RegularExpression(@"[0-9]{4}", ErrorMessage = "{0} không đúng.")]
        [Display(Name = "Năm sinh gia sư")]
        public string CustomTutorBirthYear
        {
            get { return TutorBirthYear; }
            set { TutorBirthYear = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Thành phần gia sư")]
        public string CustomTutorLevel
        {
            get { return TutorLevel; }
            set { TutorLevel = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Trường/Đơn vị công tác")]
        public string CustomTutorUniversityName
        {
            get { return TutorUniversityName; }
            set { TutorUniversityName = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Chuyên ngành")]
        public int? CustomTutorSpecialityId
        {
            get { return TutorSpecialityId; }
            set { TutorSpecialityId = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [DataType(DataType.PhoneNumber)]
        [RegularExpression(@"[0-9]{6,13}", ErrorMessage = "{0} phải là dãy số viết liền không cách, có độ dài từ 6 đến 13 ký số.")]
        [Display(Name = "Điện thoại")]
        public string CustomTutorMobiPhone
        {
            get { return TutorMobiPhone; }
            set { TutorMobiPhone = value; }
        }

        [DataType(DataType.EmailAddress)]
        [RegularExpression(@"^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$", ErrorMessage = "{0} không đúng.")]
        [Display(Name = "E-mail")]
        public string CustomTutorEmail
        {
            get { return TutorEmail; }
            set { TutorEmail = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Số nhà/phòng")]
        public string CustomTutorHouseNumber
        {
            get { return TutorHouseNumber; }
            set { TutorHouseNumber = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Tên đường")]
        public string CustomTutorStreet
        {
            get { return TutorStreet; }
            set { TutorStreet = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Tên phường")]
        public string CustomTutorWard
        {
            get { return TutorWard; }
            set { TutorWard = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Tên huyện/quận")]
        public int? CustomTutorDistrictId
        {
            get { return TutorDistrictId; }
            set { TutorDistrictId = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Tên tỉnh/thành phố")]
        public int? CustomTutorProvinceId
        {
            get { return TutorProvinceId; }
            set { TutorProvinceId = value; }
        }

        //===========================================================//

        public object AllowTeach
        {
            get
            {
                if (OrderedStatus != "4")
                {
                    return new { title = "Duyệt giao dịch" };
                }
                return new { style = "display:none;" };
            }
        }

        public object AllowCancelTeach
        {
            get
            {
                if (OrderedStatus == "4")
                {
                    return new { title = "Bỏ duyệt giao dịch", style="color:red;" };
                }
                return new { style = "display:none;" };
            }
        }

        public object AllowClose
        {
            get
            {
                if (Status != "4")
                {
                    return new { title = "Đóng giao dịch" };
                }
                return new { style = "display:none;" };
            }
        }

        public object AllowOpen
        {
            get
            {
                if (Status == "4")
                {
                    return new { title = "Mở giao dịch" };
                }
                return new { style = "display:none;" };
            }
        }

        public string GetMakeUpId
        {
            get { return Id.ToString("000000"); }
        }

        public string GetItemId
        {
            get
            {
                if (ClassId.HasValue && ClassId != 0)
                {
                    return ClassId.ToString();
                }
                if (ClassFindingId.HasValue && ClassFindingId != 0)
                {
                    return ClassFindingId.ToString();
                }
                return "";
            }
        }

        public string GetMakeUpItemId
        {
            get
            {
                if (ClassId.HasValue && ClassId != 0)
                {
                    return Class.GetMakeUpId(ClassId.Value);
                }
                if (ClassFindingId.HasValue && ClassFindingId != 0)
                {
                    return TutorClassFindingRequest.GetMakeUpId(ClassFindingId.Value);
                }
                return "";
            }
        }

        public string GetClasses
        {
            get
            {
                if (Class != null)
                {
                    return Class.ClassRequirement.ClassMaster.Name;
                }
                if (TutorClassFindingRequest != null)
                {
                    return TutorClassFindingRequest.GetClassesCanTeach;
                }
                return "";
            }
        }

        public string GetSubjects
        {
            get
            {
                if (Class != null)
                {
                    return Class.ClassRequirement.Subjects;
                }
                if (TutorClassFindingRequest != null)
                {
                    return TutorClassFindingRequest.TutorClassRequireSkill.Subjects;
                }
                return "";
            }
        }

        public string GetGetClassStatus
        {
            get
            {
                if (Class != null)
                {
                    if (Class.IsDeleted != true && Class.Status == "4" && (Class.OrderedStatus == "3" || Class.OrderedStatus == "4") && IsDeleted != true && Status == "3" && OrderedStatus != "3" && OrderedStatus != "4")
                    {
                        return "Lớp đã có người dạy";
                    }
                    if ((Class.Status != "3" && Class.Status != "4") || Class.IsDeleted == true)
                    {
                        return "Lớp ngưng tìm gia sư";
                    }
                    if (IsDeleted == true)
                    {
                        return "Đã xóa bởi quản trị";
                    }
                    if (Status == "0")
                    {
                        return "Bạn đã hủy";
                    }
                    if (Status == "4")
                    {
                        return "Đã đóng bởi quản trị";
                    }
                    if (Class.Status == "4" && OrderedStatus != "3" && OrderedStatus != "4")
                    {
                        return "Lớp ngưng tìm gia sư";
                    }
                    switch (OrderedStatus)
                    {
                        case "1": return "Chờ duyệt";
                        case "2": return "Đang được xem xét";
                        case "3":
                        case "4":
                            string status = OrderedStatus == "3" ? "<span style=\"color:Red;\"><b>Dạy thử</b></span>" : "<span style=\"color:Red;\"><b>Đã nhận</b></span>";
                            status += "<ul><li>Liên hệ: " + Class.Name + "</li><li>Địa chỉ: " + Class.GetFullAddress + "</li><li>Điện thoại: " + Class.MobiPhone + "</li></ul>";
                            return status;
                        default: return "";
                    }
                }
                if (TutorClassFindingRequest != null)
                {
                    if ((TutorClassFindingRequest.Status == "3" || TutorClassFindingRequest.Status == "4") && TutorClassFindingRequest.IsDeleted != true)
                    {
                        string status = null;
                        if (OrderedStatus == "3")
                        {
                            status = "<span style=\"color:Red;\"><b>Dạy thử</b></span>";
                        }
                        else if (OrderedStatus == "4")
                        {
                            status = "<span style=\"color:Red;\"><b>Đã nhận</b></span>";
                        }
                        if (!string.IsNullOrEmpty(status))
                        {
                            status += "<ul><li>Liên hệ: " + ParentsName + "</li><li>Địa chỉ: " + GetFullClassAddress + "</li><li>Điện thoại: " + ParentsMobiPhone + "</li></ul>";
                            return status;
                        }
                    }
                }
                return "";
            }
        }

        public string GetHireTutorStatus
        {
            get
            {
                if (TutorClassFindingRequest != null)
                {
                    if ((TutorClassFindingRequest.Status != "3" && TutorClassFindingRequest.Status != "4") || TutorClassFindingRequest.IsDeleted == true)
                    {
                        return "Gia sư ngưng nhận lớp";
                    }
                    if (IsDeleted == true)
                    {
                        return "Đã xóa bởi quản trị";
                    }
                    if (Status == "0")
                    {
                        return "Bạn đã hủy";
                    }
                    if (Status == "4")
                    {
                        return "Đã đóng bởi quản trị";
                    }
                    if (TutorClassFindingRequest.Status == "4" && OrderedStatus != "3" && OrderedStatus != "4")
                    {
                        return "Gia sư ngưng nhận lớp";
                    }
                    switch (OrderedStatus)
                    {
                        case "1": return "Chờ duyệt";
                        case "2": return "Đang được xem xét";
                        case "3":
                        case "4":
                            string status = OrderedStatus == "3" ? "<span style=\"color:Red;\"><b>Dạy thử</b></span>" : "<span style=\"color:Red;\"><b>Đã nhận</b></span>";
                            status += "<ul><li>Gia sư: " + TutorClassFindingRequest.Name + "</li><li>Địa chỉ: " + TutorClassFindingRequest.GetFullAddress + "</li><li>Điện thoại: " + TutorClassFindingRequest.MobiPhone + "</li></ul>";
                            return status;
                        default: return "";
                    }
                }
                if (Class != null)
                {
                    if (Class.Status == "4" && Class.IsDeleted != true)
                    {
                        string status = null;
                        if (OrderedStatus == "3")
                        {
                            status = "<span style=\"color:Red;\"><b>Dạy thử</b></span>";
                        }
                        else if (OrderedStatus == "4")
                        {
                            status = "<span style=\"color:Red;\"><b>Đã nhận</b></span>";
                        }
                        if (!string.IsNullOrEmpty(status))
                        {
                            status += "<ul><li>Gia sư: " + TutorName + "</li><li>Địa chỉ: " + GetFullTutorAddress + "</li><li>Điện thoại: " + TutorMobiPhone + "</li></ul>";
                            return status;
                        }
                    }
                }
                return "";
            }
        }

        public string GetOrdererType
        {
            get
            {
                if (ClassFindingId.HasValue)
                {
                    string parentsGender = ParentsGender == "1" ? "Nam" : "Nữ";
                    return (parentsGender + ", sinh năm " + ParentsBirthYear);
                }
                if (ClassId.HasValue)
                {
                    string tutorGender = TutorGender == "1" ? "Nam" : "Nữ";
                    return (tutorGender + ", sinh năm " + TutorBirthYear);
                }
                return "";
            }
        }

        public string GetOrdererInfo
        {
            get
            {
                if (ClassFindingId.HasValue)
                {
                    string parentsInfo = "- " + ParentsName + "<br />";
                    parentsInfo += "- " + GetOrdererType + "<br />";
                    parentsInfo += "- ĐT: " + ParentsMobiPhone;
                    return parentsInfo;
                }
                if (ClassId.HasValue)
                {
                    string tutorInfo = "- " + TutorName + "<br />";
                    tutorInfo += "- " + GetOrdererType + "<br />";
                    tutorInfo += "- Đvị: " + TutorUniversityName + "<br />";
                    tutorInfo += "- Ngành: " + SpecialityMaster.Name + "<br />";
                    tutorInfo += "- ĐT: " + TutorMobiPhone;
                    return tutorInfo;
                }
                return "";
            }
        }

        public bool IsAllowGet
        {
            get
            {
                if (IsDeleted == true || Status == "0" || Status == "4")
                {
                    if (TutorClassFindingRequest != null && TutorClassFindingRequest.IsValidTutorId(TutorClassFindingRequest.Id))
                    {
                        return TutorClassFindingRequest.IsGetable(AuthorId.Value, ClassFindingId.Value);
                    }
                    if (Class != null && Class.IsValidClassId(Class.Id))
                    {
                        return Class.IsGetable(AuthorId.Value, ClassId.Value);
                    }
                }
                return false;
            }
        }

        public object AllowGet
        {
            get
            {
                if (IsAllowGet)
                {
                    if (TutorClassFindingRequest != null)
                    {
                        return new { title = "Đăng ký nhận lại gia sư này." };
                    }
                    if (Class != null)
                    {
                        return new { title = "Đăng ký nhận dạy lại lớp này." };
                    }
                }
                return new { style = "display:none;" };
            }
        }

        public bool IsAllowCancel
        {
            get
            {
                if (IsDeleted != true && Status != "0" && Status != "4" && OrderedStatus != "3" && OrderedStatus != "4")
                {
                    if (TutorClassFindingRequest != null && TutorClassFindingRequest.IsValidTutorId(TutorClassFindingRequest.Id))
                    {
                        return true;
                    }
                    if (Class != null && Class.IsValidClassId(Class.Id))
                    {
                        return true;
                    }
                }
                return false;
            }
        }

        public object AllowCancel
        {
            get
            {
                if (IsAllowCancel)
                {
                    if (TutorClassFindingRequest != null)
                    {
                        return new { title = "Hủy việc nhận gia sư này." };
                    }
                    if (Class != null)
                    {
                        return new { title = "Hủy việc nhận dạy lớp này." };
                    }
                }
                return new { style = "display:none;" };
            }
        }

        public string GetFullTutorAddress
        {
            get
            {
                if (Class == null)
                {
                    return "";
                }
                string address = "";
                address += (string.IsNullOrEmpty(TutorHouseNumber) ? "" : ("(Số) " + TutorHouseNumber));
                address += (string.IsNullOrEmpty(TutorStreet) ? "" : ((string.IsNullOrEmpty(address) ? "" : ", (Đ.) ") + TutorStreet));
                address += (string.IsNullOrEmpty(TutorWard) ? "" : ((string.IsNullOrEmpty(address) ? "" : ", (P.) ") + TutorWard));
                address += (DistrictMaster == null ? "" : ((string.IsNullOrEmpty(address) ? "" : ", ") + DistrictMaster.Name));
                address += (ProvinceMaster == null ? "" : ((string.IsNullOrEmpty(address) ? "" : ", ") + ProvinceMaster.Name));
                return address;
            }
        }

        public string GetFullClassAddress
        {
            get
            {
                if (TutorClassFindingRequest == null)
                {
                    return "";
                }
                string address = "";
                address += (string.IsNullOrEmpty(ParentsHouseNumber) ? "" : ("(Số) " + ParentsHouseNumber));
                address += (string.IsNullOrEmpty(ParentsStreet) ? "" : ((string.IsNullOrEmpty(address) ? "" : ", (Đ.) ") + ParentsStreet));
                address += (string.IsNullOrEmpty(ParentsWard) ? "" : ((string.IsNullOrEmpty(address) ? "" : ", (P.) ") + ParentsWard));
                address += (DistrictMaster1 == null ? "" : ((string.IsNullOrEmpty(address) ? "" : ", ") + DistrictMaster1.Name));
                address += (ProvinceMaster1 == null ? "" : ((string.IsNullOrEmpty(address) ? "" : ", ") + ProvinceMaster1.Name));
                return address;
            }
        }

        //==========================================//

        public static void SetTeach(int id)
        {
            var tran = ClassTutorTransaction.GetTransactionById(id);
            if (tran != null)
            {
                if (tran.ClassId.HasValue)
                {
                    var trans = Db.db.ClassTutorTransactions.Where(i => i.Status != "0" && i.ClassId == tran.ClassId);
                    foreach (var item in trans)
                    {
                        item.OrderedStatus = "1";
                    }
                    Class.CloseClass(tran.ClassId.Value);
                }
                tran.Status = "3";
                tran.OrderedStatus = "4";
                Db.db.SaveChanges();
            }
        }

        public static void SetCancelTeach(int id)
        {
            var tran = ClassTutorTransaction.GetTransactionById(id);
            if (tran != null)
            {
                if (tran.ClassId.HasValue)
                {
                    Class.UnlockClass(tran.ClassId.Value);
                }
                tran.Status = "3";
                tran.OrderedStatus = "1";
                Db.db.SaveChanges();
            }
        }

        public static void SetClose(int id)
        {
            var tran = ClassTutorTransaction.GetTransactionById(id);
            if (tran != null)
            {
                tran.Status = "4";
                tran.OrderedStatus = "1";
                Db.db.SaveChanges();
            }
        }

        public static void SetOpen(int id)
        {
            var tran = ClassTutorTransaction.GetTransactionById(id);
            if (tran != null)
            {
                tran.Status = "3";
                tran.OrderedStatus = "1";
                Db.db.SaveChanges();
            }
        }

        public static void CancelTransaction(int id)
        {
            var o = Db.db.ClassTutorTransactions.FirstOrDefault(i => i.Id == id);
            if (o != null)
            {
                o.Status = "0";
                o.UpdatedTime = DateTime.Now;

                Db.db.SaveChanges();
            }
        }

        public static ClassTutorTransaction GetTransactionById(int id)
        {
            return Db.db.ClassTutorTransactions.FirstOrDefault(i => i.Id == id);
        }

        public static void UpdateTransaction(ClassTutorTransaction model)
        {
            var originalModel = GetTransactionById(model.Id);
            if (originalModel != null)
            {
                model.CreatedTime = originalModel.CreatedTime;
                model.DeletedTime = originalModel.DeletedTime;
                model.UpdatedTime = DateTime.Now;

                //----------------------

                Db.db.ClassTutorTransactions.ApplyCurrentValues(model);
                Db.db.SaveChanges();
            }
        }

        public static void AddTransaction(ClassTutorTransaction model)
        {
            model.OrderedStatus = "1";
            model.IsDeleted = false;
            model.CreatedTime = DateTime.Now;
            model.UpdatedTime = model.CreatedTime;
            Db.db.ClassTutorTransactions.AddObject(model);
            Db.db.SaveChanges();
        }

        public static List<ClassTutorTransaction> GetGetClassHistory(int userId)
        {
            return Db.db.ClassTutorTransactions.Where(i => (i.AuthorId == userId && i.Class != null) || (i.TutorClassFindingRequest != null && i.TutorClassFindingRequest.AuthorId == userId && (i.TutorClassFindingRequest.Status == "3" || i.TutorClassFindingRequest.Status == "4") && i.TutorClassFindingRequest.IsDeleted != true && i.IsDeleted != true && i.Status == "3" && (i.OrderedStatus == "3" || i.OrderedStatus == "4"))).OrderByDescending(i => i.UpdatedTime).ToList();
        }

        public static List<ClassTutorTransaction> GetGetClassHistory(int userId, int tutorId)
        {
            return Db.db.ClassTutorTransactions.Where(i => i.TutorClassFindingRequest != null && i.ClassFindingId == tutorId && i.TutorClassFindingRequest.AuthorId == userId && (i.TutorClassFindingRequest.Status == "3" || i.TutorClassFindingRequest.Status == "4") && i.TutorClassFindingRequest.IsDeleted != true && i.IsDeleted != true && i.Status == "3" && (i.OrderedStatus == "3" || i.OrderedStatus == "4")).OrderByDescending(i => i.UpdatedTime).ToList();
        }

        public static List<ClassTutorTransaction> GetHireTutorHistory(int userId)
        {
            return Db.db.ClassTutorTransactions.Where(i => (i.AuthorId == userId && i.TutorClassFindingRequest != null) || (i.Class != null && i.Class.AuthorId == userId && i.Class.Status == "4" && (i.Class.OrderedStatus == "3" || i.Class.OrderedStatus == "4") && i.Class.IsDeleted != true && i.Status == "3" && (i.OrderedStatus == "3" || i.OrderedStatus == "4"))).OrderByDescending(i => i.UpdatedTime).ToList();
        }

        public static List<ClassTutorTransaction> GetHireTutorHistory(int userId, int classId)
        {
            return Db.db.ClassTutorTransactions.Where(i => i.Class != null && i.ClassId == classId && i.Class.AuthorId == userId && i.Class.Status == "4" && (i.Class.OrderedStatus == "3" || i.Class.OrderedStatus == "4") && i.Class.IsDeleted != true && i.Status == "3" && (i.OrderedStatus == "3" || i.OrderedStatus == "4")).OrderByDescending(i => i.UpdatedTime).ToList();
        }
    }

    public partial class ProfileExperience
    {
        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Tên trường")]
        public string CustomOrganizationName
        {
            get { return OrganizationName; }
            set { OrganizationName = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Bằng cấp")]
        public string CustomPosition
        {
            get { return Position; }
            set { Position = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Năm bắt đầu")]
        public string CustomStartDate
        {
            get { return StartDate.ToString(); }
            set
            {
                try
                {
                    StartDate = Config.StringToDateTime(value, Culture.Vietnames);
                }
                catch
                {
                    throw new Exception("Không đúng định dạng ngày/tháng/năm.");
                }
            }
        }

        [Display(Name = "Năm kết thúc")]
        public string CustomEndDate
        {
            get { return EndDate.ToString(); }
            set
            {
                if (string.IsNullOrEmpty(value))
                {
                    EndDate = null;
                }
                else
                {
                    try
                    {
                        EndDate = Config.StringToDateTime(value, Culture.Vietnames);
                    }
                    catch
                    {
                        throw new Exception("Không đúng định dạng ngày/tháng/năm.");
                    }
                }
            }
        }

        //===================================//

        public static List<ProfileExperience> GetProfileExperiences(string userName)
        {
            var os = Db.db.ProfileExperiences.Where(i => i.UserMaster.UserName == userName && i.IsDeleted != true).ToList();
            return os;
        }

        public static void AddNew(ProfileExperience profileExperience, int userId)
        {
            profileExperience.CreatedTime = DateTime.Now;
            profileExperience.UpdatedTime = profileExperience.CreatedTime;
            profileExperience.IsDeleted = false;
            profileExperience.UserId = userId;

            Db.db.ProfileExperiences.AddObject(profileExperience);
            Db.db.SaveChanges();
        }

        public static void Delete(int id)
        {
            ProfileExperience o = Db.db.ProfileExperiences.FirstOrDefault(i => i.Id == id);
            o.IsDeleted = true;
            o.DeletedTime = DateTime.Now;
            o.UpdatedTime = o.DeletedTime;

            Db.db.SaveChanges();
        }

        public static string GetDateValue(DateTime? time)
        {
            return time.HasValue ? time.Value.ToShortDateString() : "-";
        }
    }

    public partial class UserEducation
    {
        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Tên trường")]
        public string CustomSchoolName
        {
            get { return SchoolName; }
            set { SchoolName = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Bằng cấp")]
        public string CustomDegree
        {
            get { return Degree; }
            set { Degree = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [RegularExpression(@"[0-9]{4}", ErrorMessage = "{0} không đúng.")]
        [Display(Name = "Năm bắt đầu")]
        public int CustomStartYear
        {
            get { return string.IsNullOrEmpty(StartYear) ? 0 : int.Parse(StartYear); }
            set { StartYear = value.ToString(); }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [RegularExpression(@"[0-9]{4}", ErrorMessage = "{0} không đúng.")]
        [Display(Name = "Năm tốt nghiệp")]
        public int CustomGraduatedYear
        {
            get { return string.IsNullOrEmpty(GraduatedYear) ? 0 : int.Parse(GraduatedYear); }
            set { GraduatedYear = value.ToString(); }
        }

        //=================================================//

        public static List<UserEducation> GetUserEducations(string userName)
        {
            var os = Db.db.UserEducations.Where(i => i.UserMaster.UserName == userName && i.IsDeleted != true).ToList();
            return os;
        }

        public static void AddNew(UserEducation userEducation, int userId)
        {
            userEducation.CreatedTime = DateTime.Now;
            userEducation.UpdatedTime = userEducation.CreatedTime;
            userEducation.IsDeleted = false;
            userEducation.UserId = userId;

            Db.db.UserEducations.AddObject(userEducation);
            Db.db.SaveChanges();
        }

        public static void Delete(int id)
        {
            UserEducation o = Db.db.UserEducations.FirstOrDefault(i => i.Id == id);
            o.IsDeleted = true;
            o.DeletedTime = DateTime.Now;
            o.UpdatedTime = o.DeletedTime;

            Db.db.SaveChanges();
        }
    }

    public partial class ArticleCategory
    {
        public int GetTotalNumOfValidArticles
        {
            get
            {
                return Articles != null ? Articles.Where(i => i.IsDeleted != true).Count() : 0;
            }
        }

        //=============================//

        public static List<Article> GetArticlesById(int categoryId, string status)
        {
            if (!IsValidCategoryId(categoryId))
            {
                return new List<Article>();
            }
            if (status == "4")
            {
                return Db.db.Articles.Where(i => i.ArticleCategoryId == categoryId && i.IsDeleted == true).OrderByDescending(i => i.UpdatedTime).ToList();
            }
            return Db.db.Articles.Where(i => i.ArticleCategoryId == categoryId && i.IsDeleted != true && i.Status == status).OrderByDescending(i => i.UpdatedTime).ToList();
        }

        public static bool IsValidCategoryId(int positionId)
        {
            var o = GetCategoryById(positionId);
            return (o != null && o.IsDeleted != true);
        }

        public static ArticleCategory GetCategoryById(int id)
        {
            return Db.db.ArticleCategories.FirstOrDefault(i => i.Id == id);
        }

        public static List<SimpleObject> GetSimpleCategories()
        {
            return Db.db.ArticleCategories.Where(i => i.IsDeleted != true).OrderBy(i => i.DisplayOrder).Select(i => new SimpleObject { Id = i.Id, StringValue = i.CategoryName }).ToList();
        }

        public static List<SimpleObject> GetAllSimpleCategories()
        {
            return Db.db.ArticleCategories.OrderBy(i => i.DisplayOrder).Select(i => new SimpleObject { Id = i.Id, StringValue = i.CategoryName }).ToList();
        }

        public static List<Article> GetArtsByPage(int categoryId, string status, bool isDeleted, int page, int pageSize)
        {
            if (!IsValidCategoryId(categoryId))
            {
                return new List<Article>();
            }
            return Db.db.Articles.Where(i => i.ArticleCategoryId == categoryId && i.Status == status && i.IsDeleted == isDeleted).OrderByDescending(i => i.UpdatedTime).Skip((page - 1) * pageSize).Take(pageSize).ToList();
        }

        public static List<SimpleObject> GetSimpleRelativeArts(int categoryId, int? index)
        {
            if (!IsValidCategoryId(categoryId))
            {
                return new List<SimpleObject>();
            }
            if (index.HasValue)
            {
                int n = Config.GetNumOfRelativeNews() / 2;
                return Db.db.Articles.Where(i => i.ArticleCategoryId == categoryId && i.Status == "3" && i.IsDeleted != true).OrderByDescending(i => i.UpdatedTime).Skip((index.Value > n ? (index.Value - n) : 0)).Take(n * 2).Select(i => new SimpleObject { Id = i.Id, StringValue = i.Title }).ToList();
            }
            return new List<SimpleObject>();
        }
    }

    public partial class Article
    {
        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Tiêu đề")]
        public string CustomTitle
        {
            get { return Title; }
            set { Title = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Danh mục")]
        public int CustomArticalCategotyId
        {
            get { return ArticleCategoryId.HasValue ? ArticleCategoryId.Value : 0; }
            set { ArticleCategoryId = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Trích dẫn")]
        public string CustomPostIntro
        {
            get { return PostIntro; }
            set { PostIntro = value; }

        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Nội dung")]
        public string CustomContent
        {
            get { return Content; }
            set { Content = value; }
        }

        public HttpPostedFileBase CustomImageFileName { get; set; }

        //========================================//

        public string GetMakeUpId
        {
            get
            {
                return Id.ToString("000000");
            }
        }

        public string GetStatusCode
        {
            get
            {
                if (IsDeleted == true)
                {
                    return "4";
                }
                switch (Status)
                {
                    case "2": return "2";
                    case "3": return "3";
                    default: return "";
                }
            }
        }

        public string GetStatus
        {
            get
            {
                if (IsDeleted == true)
                {
                    return "Đã xóa";
                }
                switch (Status)
                {
                    case "2": return "Chờ duyệt";
                    case "3": return "Đang đăng";
                    default: return "";
                }
            }
        }

        //=================================//

        public static int CompareArtInfoByUpdatedTime(Article x, Article y)
        {
            return y.UpdatedTime.Value.CompareTo(x.UpdatedTime.Value); 
        }

        public static List<Article> GetArticlesByKeyword(string keyword)
        {
            keyword = myString.RemoveMarks(keyword.Trim()).ToLower();
            var source = Db.db.Articles.OrderByDescending(i => i.UpdatedTime).ToList();
            var os = source.FindAll(delegate(Article x) { return (myString.RemoveMarks(x.Title).ToLower().Contains(keyword) || myString.RemoveMarks(x.PostIntro).ToLower().Contains(keyword) || myString.RemoveMarks(x.Content).ToLower().Contains(keyword)); });
            os.Sort(CompareArtInfoByUpdatedTime);
            return os;
        }

        public static Article GetArtById(int Id)
        {
            return Db.db.Articles.Where(i => i.Id == Id).FirstOrDefault();
        }

        public static List<Article> GetArtsByPage(string status, bool isDeleted, int page, int pageSize)
        {
            return Db.db.Articles.Where(i => i.Status == status && i.IsDeleted == isDeleted).OrderByDescending(i => i.UpdatedTime).Skip((page - 1) * pageSize).Take(pageSize).ToList();
        }

        public static int GetTotalNumOfArticles()
        {
            return Db.db.Articles.Where(i => i.IsDeleted != true && i.ArticleCategory.IsDeleted != true).Count();
        }

        public static int GetTotalOfPages()
        {
            int totalItemsOfBigestCategory = 0;
            var categories = Db.db.ArticleCategories;
            foreach (var item in categories)
            {
                totalItemsOfBigestCategory = totalItemsOfBigestCategory < item.GetTotalNumOfValidArticles ? item.GetTotalNumOfValidArticles : totalItemsOfBigestCategory;
            }
            int pageSize = Config.GetPageSizeOfNews();
            int totalPages = totalItemsOfBigestCategory / pageSize;
            if (totalItemsOfBigestCategory % pageSize != 0)
            {
                totalPages++;
            }
            return totalPages;
        }

        public static List<SimpleObject> GetSimpleRelativeArts(int index)
        {
            int n = Config.GetNumOfRelativeNews() / 2;
            return Db.db.Articles.Where(i => i.Status == "3" && i.IsDeleted != true).OrderByDescending(i => i.UpdatedTime).Skip((index > n ? (index - n) : 0)).Take(n * 2).Select(i => new SimpleObject { Id = i.Id, StringValue = i.Title }).ToList();
        }

        public static bool IsValidArtId(int artId)
        {
            return (GetArtById(artId) != null);
        }

        public static void DeleteArt(int artId)
        {
            Article o = GetArtById(artId);
            if (o != null)
            {
                o.IsDeleted = true;
                o.DeletedTime = DateTime.Now;
                o.UpdatedTime = o.DeletedTime;
                Db.db.SaveChanges();
            }
        }

        public static void LockArt(int artId)
        {
            Article o = GetArtById(artId);
            if (o != null)
            {
                o.Status = "2";
                o.UpdatedTime = DateTime.Now;
                Db.db.SaveChanges();
            }
        }

        public static void UnlockArt(int artId)
        {
            Article o = GetArtById(artId);
            if (o != null)
            {
                o.Status = "3";
                o.IsDeleted = false;
                o.UpdatedTime = DateTime.Now;
                Db.db.SaveChanges();
            }
        }

        public static void UndeleteArt(int artId)
        {
            Article o = GetArtById(artId);
            if (o != null)
            {
                o.IsDeleted = false;
                o.UpdatedTime = DateTime.Now;
                Db.db.SaveChanges();
            }
        }

        public static string ApproveArt(Article art)
        {
            art.Status = "3";
            art.IsDeleted = false;
            return UpdateArt(art);
        }

        public static string ApproveUndeleteArt(Article art)
        {
            art.IsDeleted = false;
            return UpdateArt(art);
        }

        public static string UpdateArt(Article art)
        {
            if (!IsValidArtId(art.Id))
            {
                return "Bài viết này không tồn tại";
            }
            else
            {
                art.UpdatedTime = DateTime.Now;
                Db.db.Articles.ApplyCurrentValues(art);
                Db.db.SaveChanges();
                return null;
            }
        }

        public static string AddArt(Article art)
        {
            if (IsValidArtId(art.Id))
            {
                return "Mã bài viết này đã tồn tại";
            }
            else
            {
                art.Status = "3";
                art.CreatedTime = DateTime.Now;
                art.IsDeleted = false;
                art.UpdatedTime = art.CreatedTime;
                Db.db.Articles.AddObject(art);
                Db.db.SaveChanges();
                return null;
            }
        }
    }

    public partial class AdsType
    {
        public static bool IsValidAdsTypeId(int typeId)
        {
            var o = GetAdsTypeById(typeId);
            return (o != null && o.IsDeleted != true);
        }

        public static string GetAdsTypeKey(int typeId)
        {
            var o = GetAdsTypeById(typeId);
            return o == null ? null : o.Key;
        }

        public static AdsType GetAdsTypeById(int id)
        {
            return Db.db.AdsTypes.FirstOrDefault(i => i.Id == id);
        }

        public static List<SimpleObject> GetSimpleAdsTypes()
        {
            return Db.db.AdsTypes.Where(i => i.IsDeleted != true).OrderBy(i => i.DisplayOrder).Select(i => new SimpleObject() { Id = i.Id, StringValue = i.Name }).ToList();
        }

        public static List<SimpleObject> GetAllSimpleAdsTypes()
        {
            return Db.db.AdsTypes.OrderBy(i => i.DisplayOrder).Select(i => new SimpleObject() { Id = i.Id, StringValue = i.Name }).ToList();
        }
    }

    public partial class AdsInformation
    {
        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Vị trí quảng cáo")]
        public int CustomAdsPositionId
        {
            get { return AdsPositionId != null ? AdsPositionId.Value : 0; }
            set { AdsPositionId = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Loại quảng cáo")]
        public int CustomAdsTypeId
        {
            get { return AdsTypeId.HasValue ? AdsTypeId.Value : 0; }
            set { AdsTypeId = value; }
        }

        [Display(Name = "Tệp nguồn")]
        public HttpPostedFileBase CustomContentOriginal
        {
            get;
            set;
        }

        [Display(Name = "Đích đến")]
        public string CustomDestinationURL
        {
            get { return DestinationURL; }
            set { DestinationURL = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Ngày bắt đầu")]
        public string CustomValidDateTime
        {
            get { return ValidDateTime != null ? ValidDateTime.Value.ToShortDateString() : DateTime.Now.ToShortDateString(); }
            set { ValidDateTime = Config.StringToDateTime(value, Culture.Vietnames); }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Ngày kết thúc")]
        public string CustomEndDateTime
        {
            get { return EndDateTime != null ? EndDateTime.Value.ToShortDateString() : DateTime.Now.AddDays(7).ToShortDateString(); }
            set { EndDateTime = Config.StringToDateTime(value, Culture.Vietnames); }
        }

        //=========================================//

        public string GetStatus
        {
            get
            {
                if (IsDeleted == true)
                {
                    return "Đã xóa";
                }
                if (Status == "2")
                {
                    return "Chờ duyệt";
                }
                DateTime today = DateTime.Now.Date;
                if (IsDeleted != true && Status == "3" && ValidDateTime <= today && EndDateTime >= today)
                {
                    return "Đang chạy";
                }
                if (IsDeleted != true && Status == "3" && ValidDateTime > today && EndDateTime > today)
                {
                    return "Chuẩn bị chạy";
                }
                if (IsDeleted != true && Status == "3" && EndDateTime < today)
                {
                    return "Hết hạn";
                }
                return "";
            }
        }

        public string GetStatusCode
        {
            get
            {
                if (IsDeleted == true)
                {
                    return "4";
                }
                if (Status == "2")
                {
                    return "5";
                }
                DateTime today = DateTime.Now.Date;
                if (IsDeleted != true && Status == "3" && ValidDateTime <= today && EndDateTime >= today)
                {
                    return "1";
                }
                if (IsDeleted != true && Status == "3" && ValidDateTime > today && EndDateTime > today)
                {
                    return "2";
                }
                if (IsDeleted != true && Status == "3" && EndDateTime < today)
                {
                    return "3";
                }
                return "";
            }
        }

        public string GetContentHTML
        {
            get
            {
                if (AdsTypeId.HasValue && AdsType.IsValidAdsTypeId(AdsTypeId.Value))
                {
                    var adsType = AdsType.GetAdsTypeById(AdsTypeId.Value);
                    return string.Format(adsType.HTMLTemplate, DestinationURL, Description, ContentOriginal, Config.GetAdsWidth());
                }
                return string.Empty;
            }
        }

        public string GetMakeUpId
        {
            get { return Id.ToString("000000"); }
        }

        //=======================================//

        public static int CompareAdsInfoByUpdatedTime(AdsInformation x, AdsInformation y)
        {
            return y.UpdatedTime.Value.CompareTo(x.UpdatedTime.Value);
        }

        public static List<AdsInformation> GetAdsInfosByKeyword(string keyword)
        {
            keyword = myString.RemoveMarks(keyword.Trim()).ToLower();
            var source = Db.db.AdsInformations.ToList();
            var os = source.FindAll(delegate(AdsInformation x) { return myString.RemoveMarks(x.Description).ToLower().Contains(keyword); });
            os.Sort(CompareAdsInfoByUpdatedTime);
            return os;
        }

        public static void LockAds(int adsId)
        {
            AdsInformation o = GetAdsById(adsId);
            if (o != null)
            {
                o.Status = "2";
                o.UpdatedTime = DateTime.Now;
                Db.db.SaveChanges();
            }
        }

        public static void UnlockAds(int adsId)
        {
            AdsInformation o = GetAdsById(adsId);
            if (o != null)
            {
                o.Status = "3";
                o.IsDeleted = false;
                o.UpdatedTime = DateTime.Now;
                Db.db.SaveChanges();
            }
        }

        public static void DeleteAds(int adsId)
        {
            AdsInformation o = GetAdsById(adsId);
            if (o != null)
            {
                o.IsDeleted = true;
                o.DeletedTime = DateTime.Now;
                o.UpdatedTime = o.DeletedTime;
                Db.db.SaveChanges();
            }
        }

        public static void UndeleteAds(int adsId)
        {
            AdsInformation o = GetAdsById(adsId);
            if (o != null)
            {
                o.IsDeleted = false;
                o.UpdatedTime = DateTime.Now;
                Db.db.SaveChanges();
            }
        }

        public static AdsInformation GetAdsById(int adsId)
        {
            return Db.db.AdsInformations.FirstOrDefault(i => i.Id == adsId);
        }

        public static string ApproveAds(AdsInformation adsInfo, string adsSourcePath, string oldAdsSourcePath)
        {
            adsInfo.Status = "3";
            adsInfo.IsDeleted = false;
            return UpdateAds(adsInfo, adsSourcePath, oldAdsSourcePath);
        }

        public static string ApproveUndeleteAds(AdsInformation adsInfo, string adsSourcePath, string oldAdsSourcePath)
        {
            adsInfo.IsDeleted = false;
            return UpdateAds(adsInfo, adsSourcePath, oldAdsSourcePath);
        }

        public static string UpdateAds(AdsInformation adsInfo, string adsSourcePath, string oldAdsSourcePath)
        {
            if (!IsValidAdsId(adsInfo.Id))
            {
                return "Quảng cáo này không tồn tại";
            }
            if (adsInfo.ValidDateTime > adsInfo.EndDateTime)
            {
                return "Ngày kết thúc phải lớn hơn hoặc bằng ngày bắt đầu";
            }
            else
            {
                string saveAdsSourceError = SaveAdsSource(adsInfo, adsSourcePath, oldAdsSourcePath);
                if (!string.IsNullOrEmpty(saveAdsSourceError))
                {
                    return saveAdsSourceError;
                }
                adsInfo.UpdatedTime = DateTime.Now;
                Db.db.AdsInformations.ApplyCurrentValues(adsInfo);
                Db.db.SaveChanges();
                return null;
            }
        }

        public static string AddAds(AdsInformation adsInfo, string adsSourcePath)
        {
            if (IsValidAdsId(adsInfo.Id))
            {
                return "Mã quảng cáo này đã tồn tại";
            }
            if (adsInfo.ValidDateTime > adsInfo.EndDateTime)
            {
                return "Ngày kết thúc phải lớn hơn hoặc bằng ngày bắt đầu";
            }
            else
            {
                string saveAdsSourceError = SaveAdsSource(adsInfo, adsSourcePath, null);
                if (!string.IsNullOrEmpty(saveAdsSourceError))
                {
                    return saveAdsSourceError;
                }
                adsInfo.Status = "3";
                adsInfo.IsDeleted = false;
                adsInfo.CreatedTime = DateTime.Now;
                adsInfo.UpdatedTime = adsInfo.CreatedTime;
                Db.db.AdsInformations.AddObject(adsInfo);
                Db.db.SaveChanges();
                return null;
            }
        }

        private static string SaveAdsSource(AdsInformation adsInfo, string adsSourcePath, string oldAdsSourcePath)
        {
            if (!adsInfo.AdsTypeId.HasValue || !AdsType.IsValidAdsTypeId(adsInfo.AdsTypeId.Value))
            {
                return "Loại tệp quảng cáo này không khả dụng";
            }
            if (!string.IsNullOrEmpty(adsSourcePath))
            {
                var bannerType = AdsType.GetAdsTypeById(adsInfo.AdsTypeId.Value);
                if (bannerType.AttemptResizeImage == true)
                {
                    try
                    {
                        Bitmap original = Bitmap.FromStream(adsInfo.CustomContentOriginal.InputStream) as Bitmap;
                        int newWidth = Config.GetAdsWidth();
                        int newHeight = original.Height * newWidth / original.Width;
                        Bitmap resizedBitmap = new Bitmap(newWidth, newHeight);
                        Graphics g = Graphics.FromImage(resizedBitmap as Image);
                        g.DrawImage(original, 0, 0, newWidth, newHeight);
                        resizedBitmap.Save(adsSourcePath);
                    }
                    catch (Exception err)
                    {
                        return "Lưu tệp thất bại (" + err.Message + ").";
                    }
                }
                else
                {
                    try
                    {
                        adsInfo.CustomContentOriginal.SaveAs(adsSourcePath);
                    }
                    catch (Exception err)
                    {
                        return "Lưu tệp thất bại (" + err.Message + ").";
                    }
                }
                if (!Config.GetKeepOldAds() && !string.IsNullOrEmpty(oldAdsSourcePath))
                {
                    try
                    {
                        File.Delete(oldAdsSourcePath);
                    }
                    catch { }
                }
            }
            return null;
        }

        public static bool IsValidAdsId(int adsId)
        {
            return (GetAdsById(adsId) != null);
        }
    }

    public partial class AdsPosition
    {
        public static bool IsValidPositionId(int positionId)
        {
            var o = GetPositionById(positionId);
            if (o != null && o.IsDeleted != true)
            {
                return true;
            }
            return false;
        }

        public static bool IsValidPositionKey(string positionKey)
        {
            var o = GetPositionByKey(positionKey);
            if (o != null)
            {
                return IsValidPositionId(o.Id);
            }
            return false;
        }

        public static List<SimpleObject> GetAllSimplePositions()
        {
            return Db.db.AdsPositions.OrderBy(i => i.DisplayOrder).Select(i => new SimpleObject() { Id = i.Id, StringValue = i.Name }).ToList();
        }

        public static List<SimpleObject> GetSimplePositions()
        {
            return Db.db.AdsPositions.Where(i => i.IsDeleted != true).OrderBy(i => i.DisplayOrder).Select(i => new SimpleObject() { Id = i.Id, StringValue = i.Name }).ToList();
        }

        public static AdsPosition GetPositionByKey(string positionKey)
        {
            return Db.db.AdsPositions.FirstOrDefault(i => i.Key == positionKey);
        }

        public static AdsPosition GetPositionById(int positionId)
        {
            return Db.db.AdsPositions.FirstOrDefault(i => i.Id == positionId);
        }

        public static List<AdsInformation> GetAdsInfosByKey(string positionKey)
        {
            AdsPosition o = GetPositionByKey(positionKey);
            if (o != null)
            {
                return GetAdsInfosById(o.Id);
            }
            return new List<AdsInformation>();
        }

        public static List<AdsInformation> GetRandomAdsInfosByKey(string positionKey, string status)
        {
            AdsPosition o = GetPositionByKey(positionKey);
            if (o != null)
            {
                return GetRandomAdsInfosById(o.Id, status);
            }
            return new List<AdsInformation>();
        }

        public static List<AdsInformation> GetAdsInfosById(int positionId)
        {
            if (!IsValidPositionId(positionId))
            {
                return new List<AdsInformation>();
            }
            return Db.db.AdsInformations.Where(i => i.AdsPositionId == positionId && i.AdsType.IsDeleted != true).ToList();
        }

        public static List<AdsInformation> GetRandomAdsInfosById(int positionId, string status)
        {
            var adsInfos = GetAdsInfosById(positionId, status);
            if (adsInfos.Count > 1)
            {
                Random rand = new Random();
                int randomIndex = rand.Next(0, adsInfos.Count);
                var part1 = adsInfos.Skip(randomIndex);
                var part2 = adsInfos.Take(randomIndex);
                var randomAdsInfos = part1.Concat(part2);
                return randomAdsInfos.ToList();
            }
            return adsInfos;
        }

        public static List<AdsInformation> GetAdsInfosById(int positionId, string status)
        {
            DateTime today = DateTime.Now.Date;
            switch (status)
            {
                case "1": return Db.db.AdsInformations.Where(i => i.AdsPositionId == positionId && i.AdsType.IsDeleted != true && i.IsDeleted != true && i.Status == "3" && i.ValidDateTime <= today && i.EndDateTime >= today).OrderByDescending(i => i.UpdatedTime).ToList();
                case "2": return Db.db.AdsInformations.Where(i => i.AdsPositionId == positionId && i.AdsType.IsDeleted != true && i.IsDeleted != true && i.Status == "3" && i.ValidDateTime > today && i.EndDateTime > today).OrderByDescending(i => i.UpdatedTime).ToList();
                case "3": return Db.db.AdsInformations.Where(i => i.AdsPositionId == positionId && i.AdsType.IsDeleted != true && i.IsDeleted != true && i.Status == "3" && i.EndDateTime < today).OrderByDescending(i => i.UpdatedTime).ToList();
                case "4": return Db.db.AdsInformations.Where(i => i.AdsPositionId == positionId && i.AdsType.IsDeleted != true && i.IsDeleted == true).OrderByDescending(i => i.UpdatedTime).ToList();
                case "5": return Db.db.AdsInformations.Where(i => i.AdsPositionId == positionId && i.AdsType.IsDeleted != true && i.IsDeleted != true && i.Status == "2").OrderByDescending(i => i.UpdatedTime).ToList();
                default: return (new List<AdsInformation>());
            }
        }
    }

    public partial class TutorClassRequireSkill
    {
        [Required(ErrorMessage = "Chưa chọn dạy Từ lớp mấy.")]
        public int? CustomCanTeachClassLevelFromId
        {
            get { return CanTeachClassLevelFromId; }
            set { CanTeachClassLevelFromId = value; }
        }

        [Required(ErrorMessage = "Chưa chọn dạy Đến lớp mấy.")]
        public int? CustomCanTeachClassLevelToId
        {
            get { return CanTeachClassLevelToId; }
            set { CanTeachClassLevelToId = value; }
        }

        [Required(ErrorMessage = "Môn học không được rỗng.")]
        public string CustomSubjects
        {
            get { return Subjects; }
            set { Subjects = value; }
        }

        [Required(ErrorMessage = "Khu vực không được rỗng")]
        public string CustomAreaWantToTeach
        {
            get { return AreaWantToTeach; }
            set { AreaWantToTeach = value; }
        }

        [Required(ErrorMessage = "Thời gian dạy không được rỗng.")]
        public string CustomTimeFromTo
        {
            get { return TimeFromTo; }
            set { TimeFromTo = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Số buổi dạy trong tuần")]
        public int? CustomNumberOfTimesInWeek
        {
            get { return NumberOfTimesInWeek; }
            set { NumberOfTimesInWeek = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Mức lương đề xuất")]
        public int? CustomSalaryAmount
        {
            get { return SalaryAmount; }
            set { SalaryAmount = value; }
        }
    }

    public partial class TutorClassFindingRequest
    {
        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Tên gia sư")]
        public string CustomName
        {
            get { return Name; }
            set { Name = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Giới tính")]
        public string CustomGender
        {
            get { return Gender; }
            set { Gender = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Thành phần")]
        public string CustomTutorLevel
        {
            get { return TutorLevel; }
            set { TutorLevel = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [RegularExpression(@"[0-9]{4}", ErrorMessage = "{0} không đúng định dạng.")]
        [Display(Name = "Năm sinh")]
        public string CustomBirthYear
        {
            get { return BirthYear; }
            set { BirthYear = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Trường/Đơn vị công tác")]
        public string CustomUniversityName
        {
            get { return UniversityName; }
            set { UniversityName = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [DataType(DataType.PhoneNumber)]
        [RegularExpression(@"[0-9]{6,13}", ErrorMessage = "{0} phải là dãy số viết liền không cách, có độ dài từ 6 đến 13 ký số.")]
        [Display(Name = "Số điện thoại")]
        public string CustomMobiPhone
        {
            get { return MobiPhone; }
            set { MobiPhone = value; }
        }

        [DataType(DataType.EmailAddress)]
        [RegularExpression(@"^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$", ErrorMessage = "{0} không đúng định dạng.")]
        [Display(Name = "Email")]
        public string CustomEmail
        {
            get { return Email; }
            set { Email = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Số nhà/số phòng")]
        public string CustomHouseNumber
        {
            get { return HouseNumber; }
            set { HouseNumber = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Đường")]
        public string CustomStreet
        {
            get { return Street; }
            set { Street = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Phường")]
        public string CustomWard
        {
            get { return Ward; }
            set { Ward = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Tỉnh/Thành phố")]
        public int? CustomProvinceId
        {
            get { return ProvinceId; }
            set { ProvinceId = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Huyện/Quận")]
        public int? CustomDistrictId
        {
            get { return DistrictId; }
            set { DistrictId = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Chuyên ngành")]
        public int? CustomSpecialityId
        {
            get { return SpecialityId; }
            set { SpecialityId = value; }
        }

        public HttpPostedFileBase CustomImageFileName
        {
            get;
            set;
        }

        //======================================//

        public string GetStatus
        {
            get
            {
                if (IsDeleted == true)
                {
                    return "Đã xóa bởi quản trị";
                }
                switch (Status)
                {
                    case "0": return "Bạn đã hủy";
                    case "2": return "Chờ duyệt để đăng";
                    case "3":
                    case "4":
                        string status = Status == "3" ? "Đang đăng " : "Đã đóng ";
                        int numOfTrans = 0;
                        if (ClassTutorTransactions != null)
                        {
                            numOfTrans = ClassTutorTransactions.Where(i => i.ClassFindingId == Id && i.IsDeleted != true && i.Status == "3" && (i.OrderedStatus == "3" || i.OrderedStatus == "4")).Count();
                        }
                        if (numOfTrans > 0)
                        {
                            status += "<a href=\"/Account/GetClassHistory?tutorId=" + Id + "\" style=\"font-weight:bold; color:red;\" title =\"Số lượt đăng ký học. Xem chi tiết!\">(" + numOfTrans + ")</a>";
                        }
                        else
                        {
                            status += "<span style=\"cursor:default;\" title =\"Chưa có người đăng ký học.\">(" + numOfTrans + ")</span>";
                        }
                        return status;
                    default: return "";
                }
            }
        }

        public bool IsAllowGet
        {
            get
            {
                if (Status == "0" || Status == "4" || IsDeleted == true)
                {
                    return true;
                }
                return false;
            }
        }

        public object AllowGet
        {
            get
            {
                if (IsAllowGet)
                {
                    return new { title = "Đăng tin mới dựa trên mẫu tin này." };
                }
                return new { style = "display:none;" };
            }
        }

        public bool IsAllowCancel
        {
            get
            {
                if (Status != "0" && Status != "4" && IsDeleted != true)
                {
                    return true;
                }
                return false;
            }
        }

        public object AllowCancel
        {
            get
            {
                if (IsAllowCancel)
                {
                    return new { title = "Dừng đăng mẫu tin này." };
                }
                return new { style = "display:none;" };
            }
        }

        public string GetFullAddress
        {
            get
            {
                string address = "";
                address += (string.IsNullOrEmpty(HouseNumber) ? "" : ("(Số) " + HouseNumber));
                address += (string.IsNullOrEmpty(Street) ? "" : ((string.IsNullOrEmpty(address) ? "" : ", (Đ.) ") + Street));
                address += (string.IsNullOrEmpty(Ward) ? "" : ((string.IsNullOrEmpty(address) ? "" : ", (P.) ") + Ward));
                address += (DistrictMaster == null ? "" : ((string.IsNullOrEmpty(address) ? "" : ", ") + DistrictMaster.Name));
                address += (ProvinceMaster == null ? "" : ((string.IsNullOrEmpty(address) ? "" : ", ") + ProvinceMaster.Name));
                return address;
            }
        }

        public string GetClassesCanTeach
        {
            get
            {
                if (TutorClassRequireSkill.CanTeachClassLevelFromId == TutorClassRequireSkill.CanTeachClassLevelToId)
                    return TutorClassRequireSkill.ClassMaster.Name;
                return (TutorClassRequireSkill.ClassMaster.Name + " > " + TutorClassRequireSkill.ClassMaster1.Name);
            }
        }

        public string GetShortTutorLevel
        {
            get
            {
                switch (TutorLevel)
                {
                    case "1": return "GV";
                    case "2": return "SV";
                    default: return "TN";
                }
            }
        }

        public string GetTutorLevel
        {
            get
            {
                switch (TutorLevel)
                {
                    case "1": return "Giáo Viên";
                    case "2": return "Sinh Viên";
                    default: return "Đã Tốt Nghiệp";
                }
            }
        }

        public string GetTutorGender
        {
            get
            {
                switch (Gender)
                {
                    case "1": return "Nam";
                    default: return "Nữ";
                }
            }
        }

        public string GetShortTutorType
        {
            get
            {
                return GetTutorGender + ", " + GetShortTutorLevel;
            }
        }

        public string GetTutorType
        {
            get
            {
                return GetTutorGender + ", " + GetTutorLevel;
            }
        }

        public string GetStatusId
        {
            get
            {
                if (IsDeleted == true)
                {
                    return "6";
                }
                if (Status == "2")
                {
                    return "1";
                }
                if (Status == "3")
                {
                    if (ClassTutorTransactions != null && ClassTutorTransactions.Count(i => i.OrderedStatus != "5") > 0)
                    {
                        return "2";
                    }
                    return "3";
                }
                if (Status == "4")
                {
                    if (ClassTutorTransactions != null && ClassTutorTransactions.Count(i =>i.OrderedStatus == "3" || i.OrderedStatus == "4") > 0)
                    {
                        return "4";
                    }
                    return "5";
                }
                return "-1";
            }
        }

        public string GetAdminStatus
        {
            get
            {
                switch (GetStatusId)
                {
                    case "1": return "Chờ duyệt đăng";
                    case "2":
                    case "3": return "Đang đăng";
                    case "4":
                    case "5": return "Đã đóng";
                    case "6": return "Đã xóa";
                    default: return "";
                }
            }
        }

        //==========================================//

        public static void CancelTutor(int id)
        {
            var o = TutorClassFindingRequest.GetTutorClassFindingRequestById(id);
            if (o != null && o.IsAllowCancel)
            {
                o.Status = "0";
                o.UpdatedTime = DateTime.Now;
                Db.db.SaveChanges();
            }
        }

        public static List<TutorClassFindingRequest> GetTutorClassFindingRequestsOfUserByUserName(string userName)
        {
            var user = UserMaster.GetUserByUserName(userName);
            if (user != null && user.TutorClassFindingRequests != null)
            {
                return user.TutorClassFindingRequests.OrderByDescending(i => i.UpdatedTime).ToList();
            }
            return new List<TutorClassFindingRequest>();
        }

        public static bool IsValidTutorId(int id)
        {
            var o = GetTutorClassFindingRequestById(id);
            if (o != null && o.IsDeleted != true && o.Status == "3")
            {
                return true;
            }
            return false;
        }

        public static bool IsGetable(int userId, int tutorId)
        {
            if (IsValidTutorId(tutorId))
            {
                if (TutorClassFindingRequest.GetTutorClassFindingRequestById(tutorId).AuthorId == userId)
                {
                    return false;
                }
                var o = Db.db.ClassTutorTransactions.Where(i => i.AuthorId == userId && i.ClassFindingId == tutorId && i.IsDeleted != true && i.Status != "0" && i.Status != "4");
                return (o.Count() == 0);
            }
            return false;
        }

        public static bool IsGetable(string userPhone, int tutorId)
        {
            if (IsValidTutorId(tutorId))
            {
                var o = Db.db.ClassTutorTransactions.Where(i => i.ParentsMobiPhone == userPhone && i.ClassFindingId == tutorId && i.IsDeleted != true && i.Status != "0" && i.Status != "4");
                return (o.Count() == 0);
            }
            return false;
        }

        public static void DeleteTutor(int id)
        {
            var o = TutorClassFindingRequest.GetTutorClassFindingRequestById(id);
            if (o != null)
            {
                o.IsDeleted = true;
                o.DeletedTime = DateTime.Now;
                o.UpdatedTime = o.DeletedTime;
                Db.db.SaveChanges();
            }
        }

        public static void UndeleteTutor(int id)
        {
            var o = TutorClassFindingRequest.GetTutorClassFindingRequestById(id);
            if (o != null)
            {
                o.IsDeleted = false;
                o.UpdatedTime = DateTime.Now;
                Db.db.SaveChanges();
            }
        }

        public static void LockTutor(int id)
        {
            var o = TutorClassFindingRequest.GetTutorClassFindingRequestById(id);
            if (o != null)
            {
                o.Status = "2";
                o.UpdatedTime = DateTime.Now;
                Db.db.SaveChanges();
            }
        }

        public static void UnlockTutor(int id)
        {
            var o = TutorClassFindingRequest.GetTutorClassFindingRequestById(id);
            if (o != null)
            {
                o.Status = "3";
                o.UpdatedTime = DateTime.Now;
                Db.db.SaveChanges();
            }
        }

        public static void CloseTutor(int id)
        {
            var o = TutorClassFindingRequest.GetTutorClassFindingRequestById(id);
            if (o != null)
            {
                o.Status = "4";
                o.UpdatedTime = DateTime.Now;
                Db.db.SaveChanges();
            }
        }

        public static void ReApproveTutor(int id)
        {
            var o = TutorClassFindingRequest.GetTutorClassFindingRequestById(id);
            if (o != null)
            {
                o.Status = "3";
                o.UpdatedTime = DateTime.Now;
                var trans = o.ClassTutorTransactions.Where(i => i.Status != "0");
                foreach (var item in trans)
                {
                    item.IsDeleted = false;
                    item.Status = "3";
                    item.OrderedStatus = "1";
                }
                Db.db.SaveChanges();
            }
        }

        public static TutorClassFindingRequest GetTutorClassFindingRequestById(int id)
        {
            return Db.db.TutorClassFindingRequests.FirstOrDefault(i => i.Id == id);
        }

        public static string GetMakeUpId(int tutorId)
        {
            return "G" + tutorId.ToString("000000");
        }

        public static void UpdateTutor(TutorClassFindingRequest model)
        {
            var originalModel = GetTutorClassFindingRequestById(model.Id);
            if (originalModel != null)
            {
                model.CreatedTime = originalModel.CreatedTime;
                model.DeletedTime = originalModel.DeletedTime;
                model.UpdatedTime = DateTime.Now;

                //----------------------

                model.TutorClassRequireSkill.CreatedTime = originalModel.TutorClassRequireSkill.CreatedTime;
                model.TutorClassRequireSkill.DeletedTime = originalModel.TutorClassRequireSkill.DeletedTime;
                model.TutorClassRequireSkill.UpdatedTime = DateTime.Now;

                //----------------------

                Db.db.TutorClassFindingRequests.ApplyCurrentValues(model);
                Db.db.TutorClassRequireSkills.ApplyCurrentValues(model.TutorClassRequireSkill);
                Db.db.SaveChanges();
            }
        }

        public static void RegisterTutor(TutorClassFindingRequest model)
        {
            model.CreatedTime = DateTime.Now;
            model.UpdatedTime = DateTime.Now;
            model.IsDeleted = false;

            //----------------------

            model.TutorClassRequireSkill.CreatedTime = DateTime.Now;
            model.TutorClassRequireSkill.UpdatedTime = DateTime.Now;
            model.TutorClassRequireSkill.IsDeleted = false;

            //----------------------
            Db.db.TutorClassFindingRequests.AddObject(model);
            Db.db.SaveChanges();
        }

        public static List<TutorClassFindingRequest> GetTopTutors(int num)
        {
            return (Db.db.TutorClassFindingRequests.OrderByDescending(i => i.UpdatedTime).Where(i => i.Status == "3" && i.IsDeleted != true).Take(num).ToList());
        }

        public static List<TutorClassFindingRequest> GetTutors(string status)
        {
            var source = Db.db.TutorClassFindingRequests.ToList();
            var result = new List<TutorClassFindingRequest>();
            foreach (var item in source)
            {
                if (item.GetStatusId == status)
                {
                    result.Add(item);
                }
            }
            return result;
        }
    }

    public partial class ClassRequirement
    {
        [Required(ErrorMessage = "{0} không được rỗng.")]
        [RegularExpression(@"[0-9]{1}", ErrorMessage = "{0} không đúng định dạng.")]
        [Display(Name = "Số lượng học sinh")]
        public int? CustomNumberOfPupil
        {
            get { return NumberOfPupil; }
            set { NumberOfPupil = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name="Số buổi dạy trong tuần")]
        public int? CustomNumberOfTimesInWeek
        {
            get { return NumberOfTimesInWeek; }
            set { NumberOfTimesInWeek = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name="Mức lương đề xuất")]
        public int? CustomSalaryAmount
        {
            get { return SalaryAmount; }
            set { SalaryAmount = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Lớp cần được dạy")]
        public int? CustomPupilClassId
        {
            get { return PupilClassId; }
            set { PupilClassId = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Môn học")]
        public string CustomSubjects
        {
            get { return Subjects; }
            set { Subjects  = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Thời gian học")]
        public string CustomTimeFromTo
        {
            get { return TimeFromTo; }
            set { TimeFromTo = value; }
        }
    }

    public partial class Class
    {
        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Tên phụ huynh")]
        public string CustomName
        {
            get { return Name; }
            set { Name = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Giới tính")]
        public string CustomGender
        {
            get { return Gender; }
            set { Gender = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [RegularExpression(@"[0-9]{4}", ErrorMessage = "{0} không đúng.")]
        [Display(Name = "Năm sinh")]
        public string CustomBirthYear
        {
            get { return BirthYear; }
            set { BirthYear = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [DataType(DataType.PhoneNumber)]
        [RegularExpression(@"[0-9]{6,13}", ErrorMessage = "{0} phải là dãy số viết liền không cách, có độ dài từ 6 đến 13 ký số.")]
        [Display(Name = "Số điện thoại")]
        public string CustomMobiPhone
        {
            get { return MobiPhone; }
            set { MobiPhone = value; }
        }

        [DataType(DataType.EmailAddress)]
        [RegularExpression(@"^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$", ErrorMessage = "{0} không đúng định dạng.")]
        [Display(Name = "Email")]
        public string CustomEmail
        {
            get { return Email; }
            set { Email = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Số nhà/số phòng")]
        public string CustomHouseNumber
        {
            get { return HouseNumber; }
            set { HouseNumber = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Đường")]
        public string CustomStreet
        {
            get { return Street; }
            set { Street = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Phường")]
        public string CustomWard
        {
            get { return Ward; }
            set { Ward = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Tỉnh/Thành phố")]
        public int? CustomProvinceId
        {
            get { return ProvinceId; }
            set { ProvinceId = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Huyện/Quận")]
        public int? CustomDistrictId
        {
            get { return DistrictId; }
            set { DistrictId = value; }
        }

        //===============================================//

        public string GetParentsGender
        {
            get
            {
                return (Gender == "1" ? "Nam" : "Nữ");
            }
        }

        public string GetStatus
        {
            get
            {
                if (IsDeleted == true)
                {
                    return "Đã xóa bởi quản trị";
                }
                switch (Status)
                {
                    case "0": return "Bạn đã hủy";
                    case "2": return "Chờ duyệt để đăng";
                    case "3": return "Đang đăng";
                    case "4": string status = "Đã đóng ";
                        int numOfTrans = 0;
                        if (ClassTutorTransactions != null)
                        {
                            numOfTrans = ClassTutorTransactions.Where(i => i.ClassId == Id && i.IsDeleted != true && i.Status == "3" && (i.OrderedStatus == "3" || i.OrderedStatus == "4")).Count();
                        }
                        if (numOfTrans > 0)
                        {
                            status += "<a href=\"/Account/HireTutorHistory?classId=" + Id + "\" style=\"font-weight:bold; color:red;\" title =\"Đã có gia sư nhận dạy. Xem chi tiết!\">(" + numOfTrans + ")</a>";
                        }
                        else
                        {
                            status += "<span style=\"cursor:default;\" title =\"Không có gia sư nhận dạy.\">(" + numOfTrans + ")</span>";
                        }
                        return status;
                    default: return "";
                }
            }
        }

        public bool IsAllowGet
        {
            get
            {
                if (Status == "0" || Status == "4" || IsDeleted == true)
                {
                    return true;
                }
                return false;
            }
        }

        public object AllowGet
        {
            get
            {
                if (IsAllowGet)
                {
                    return new { title = "Đăng tin mới dựa trên mẫu tin này." };
                }
                return new { style = "display:none;" };
            }
        }

        public bool IsAllowCancel
        {
            get
            {
                if (Status != "0" && Status != "4" && IsDeleted != true && OrderedStatus != "3" && OrderedStatus != "4")
                {
                    return true;
                }
                return false;
            }
        }

        public object AllowCancel
        {
            get
            {
                if (IsAllowCancel)
                {
                    return new { title = "Dừng đăng mẫu tin này." };
                }
                return new { style = "display:none;" };
            }
        }

        public string GetFullAddress
        {
            get
            {
                string address = "";
                address += (string.IsNullOrEmpty(HouseNumber) ? "" : ("(Số) " + HouseNumber));
                address += (string.IsNullOrEmpty(Street) ? "" : ((string.IsNullOrEmpty(address) ? "" : ", (Đ.) ") + Street));
                address += (string.IsNullOrEmpty(Ward) ? "" : ((string.IsNullOrEmpty(address) ? "" : ", (P.) ") + Ward));
                address += (DistrictMaster == null ? "" : ((string.IsNullOrEmpty(address) ? "" : ", ") + DistrictMaster.Name));
                address += (ProvinceMaster == null ? "" : ((string.IsNullOrEmpty(address) ? "" : ", ") + ProvinceMaster.Name));
                return address;
            }
        }

        public string GetShortRequiredTutorType
        {
            get
            {
                string gender = "";
                switch (ClassRequirement.TutorGender)
                {
                    case "1": gender = "Nam";
                        break;
                    case "2": gender = "Nữ";
                        break;
                    default: gender = "Nam/Nữ";
                        break;
                }
                string type = "";
                switch (ClassRequirement.TutorLevel)
                {
                    case "1": type = "GV";
                        break;
                    case "2": type = "SV";
                        break;
                    case "3": type = "TN";
                        break;
                    default:
                        break;
                }
                return gender + ", " + type;
            }
        }

        public string GetStatusId
        {
            get
            {
                if (IsDeleted == true)
                {
                    return "6";
                }
                if (Status == "2")
                {
                    return "1";
                }
                if (Status == "3")
                {
                    if (ClassTutorTransactions != null && ClassTutorTransactions.Count(i => i.OrderedStatus != "5") > 0)
                    {
                        return "2";
                    }
                    return "3";
                }
                if (Status == "4")
                {
                    if (ClassTutorTransactions != null && ClassTutorTransactions.Count(i => i.OrderedStatus == "3" || i.OrderedStatus == "4") > 0)
                    {
                        return "4";
                    }
                    return "5";
                }
                return "-1";
            }
        }

        public string GetAdminStatus
        {
            get
            {
                switch (GetStatusId)
                {
                    case "1": return "Chờ duyệt đăng";
                    case "2":
                    case "3": return "Đang đăng";
                    case "4":
                    case "5": return "Đã đóng";
                    case "6": return "Đã xóa";
                    default: return "";
                }
            }
        }

        //==============================================//

        public static List<Class> GetClassesOfUserByUserName(string userName)
        {
            var user = UserMaster.GetUserByUserName(userName);
            if (user != null && user.Classes != null)
            {
                return user.Classes.OrderByDescending(i => i.UpdatedTime).ToList();
            }
            return new List<Class>();
        }

        public static void CancelClass(int id)
        {
            var o = Class.GetClassById(id);
            if (o != null && o.IsAllowCancel)
            {
                o.Status = "0";
                o.UpdatedTime = DateTime.Now;
                Db.db.SaveChanges();
            }
        }

        public static bool IsValidClassId(int id)
        {
            var o = GetClassById(id);
            if (o != null && o.IsDeleted != true && o.Status == "3" && o.OrderedStatus != "3" && o.OrderedStatus != "4")
            {
                return true;
            }
            return false;
        }

        public static bool IsGetable(int userId, int classId)
        {
            if (IsValidClassId(classId))
            {
                if (Class.GetClassById(classId).AuthorId == userId)
                {
                    return false;
                }
                var o = Db.db.ClassTutorTransactions.Where(i => i.AuthorId == userId && i.ClassId == classId && i.IsDeleted != true && i.Status != "0" && i.Status != "4");
                return (o.Count() == 0);
            }
            return false;
        }

        public static bool IsGetable(string userPhone, int classId)
        {
            if (IsValidClassId(classId))
            {
                var o = Db.db.ClassTutorTransactions.Where(i => i.TutorMobiPhone == userPhone && i.ClassId == classId && i.IsDeleted != true && i.Status != "0" && i.Status != "4");
                return (o.Count() == 0);
            }
            return false;
        }

        public static void DeleteClass(int id)
        {
            var o = Class.GetClassById(id);
            if (o != null)
            {
                o.IsDeleted = true;
                o.DeletedTime = DateTime.Now;
                o.UpdatedTime = o.DeletedTime;
                Db.db.SaveChanges();
            }
        }

        public static void UndeleteClass(int id)
        {
            var o = Class.GetClassById(id);
            if (o != null)
            {
                o.IsDeleted = false;
                o.UpdatedTime = DateTime.Now;
                Db.db.SaveChanges();
            }
        }

        public static void LockClass(int id)
        {
            var o = Class.GetClassById(id);
            if (o != null)
            {
                o.Status = "2";
                o.UpdatedTime = DateTime.Now;
                Db.db.SaveChanges();
            }
        }

        public static void UnlockClass(int id)
        {
            var o = Class.GetClassById(id);
            if (o != null)
            {
                o.Status = "3";
                o.UpdatedTime = DateTime.Now;
                Db.db.SaveChanges();
            }
        }

        public static void CloseClass(int id)
        {
            var o = Class.GetClassById(id);
            if (o != null)
            {
                o.Status = "4";
                o.UpdatedTime = DateTime.Now;
                Db.db.SaveChanges();
            }
        }

        public static void ReApproveClass(int id)
        {
            var o = Class.GetClassById(id);
            if (o != null)
            {
                o.Status = "3";
                o.UpdatedTime = DateTime.Now;
                var trans = o.ClassTutorTransactions.Where(i => i.Status != "0");
                foreach (var item in trans)
                {
                    item.IsDeleted = false;
                    item.Status = "3";
                    item.OrderedStatus = "1";
                }
                Db.db.SaveChanges();
            }
        }

        public static Class GetClassById(int id)
        {
            return Db.db.Classes.FirstOrDefault(i => i.Id == id);
        }

        public static string GetMakeUpId(int classId)
        {
            return "L" + classId.ToString("000000");
        }

        public static List<Class> GetTopClasses(int num)
        {
            return (Db.db.Classes.OrderByDescending(i => i.UpdatedTime).Where(i => i.Status == "3" && i.IsDeleted != true).Take(num).ToList());
        }

        public static void UpdateClass(Class model)
        {
            var originalModel = GetClassById(model.Id);
            if (originalModel != null)
            {
                model.CreatedTime = originalModel.CreatedTime;
                model.DeletedTime = originalModel.DeletedTime;
                model.UpdatedTime = DateTime.Now;

                //----------------------

                model.ClassRequirement.CreatedTime = originalModel.ClassRequirement.CreatedTime;
                model.ClassRequirement.DeletedTime = originalModel.ClassRequirement.DeletedTime;
                model.ClassRequirement.UpdatedTime = DateTime.Now;

                //----------------------

                Db.db.Classes.ApplyCurrentValues(model);
                Db.db.ClassRequirements.ApplyCurrentValues(model.ClassRequirement);
                Db.db.SaveChanges();
            }
        }

        public static void RegisterClass(Class model)
        {
            model.OrderedStatus = "1";
            model.CreatedTime = DateTime.Now;
            model.UpdatedTime = DateTime.Now;
            model.IsDeleted = false;

            //----------------------

            model.ClassRequirement.CreatedTime = DateTime.Now;
            model.ClassRequirement.UpdatedTime = DateTime.Now;
            model.ClassRequirement.IsDeleted = false;

            //----------------------

            Db.db.Classes.AddObject(model);
            Db.db.SaveChanges();
        }

        public static List<Class> GetClasses(string status)
        {
            var source = Db.db.Classes.ToList();
            var result = new List<Class>();
            foreach (var item in source)
            {
                if (item.GetStatusId == status)
                {
                    result.Add(item);
                }
            }
            return result;
        }
    }

    public partial class ClassMaster
    {
        public static bool IsValidClassMasterId(int id)
        {
            var o = GetClassMasterById(id);
            return (o != null && o.IsDeleted != true);
        }

        public static ClassMaster GetClassMasterById(int id)
        {
            return Db.db.ClassMasters.FirstOrDefault(i => i.Id == id);
        }

        public static List<SimpleObject> GetSimpleClasses()
        {
            return Db.db.ClassMasters.Where(i => i.IsDeleted != true).OrderBy(i => i.DisplayOrder).Select(i => new SimpleObject() { Id = i.Id, StringValue = i.Name }).ToList();
        }

        public static List<SimpleObject> GetAllSimpleClasses()
        {
            return Db.db.ClassMasters.OrderBy(i => i.DisplayOrder).Select(i => new SimpleObject() { Id = i.Id, StringValue = i.Name }).ToList();
        }
    }

    public partial class SpecialityMaster
    {
        public static SpecialityMaster GetSpecialityMasterById(int id)
        {
            return Db.db.SpecialityMasters.FirstOrDefault(i => i.Id == id);
        }

        public static bool IsValidSpecialityId(int id)
        {
            var o = GetSpecialityMasterById(id);
            return (o != null && o.IsDeleted != true);
        }

        public static List<SimpleObject> GetSimpleSpecialities()
        {
            return Db.db.SpecialityMasters.Where(i => i.IsDeleted != true).OrderBy(i => i.DisplayOrder).Select(i => new SimpleObject() { Id = i.Id, StringValue = i.Name }).ToList();
        }

        public static List<SimpleObject> GetAllSimpleSpecialities()
        {
            return Db.db.SpecialityMasters.OrderBy(i => i.DisplayOrder).Select(i => new SimpleObject() { Id = i.Id, StringValue = i.Name }).ToList();
        }
    }

    public partial class SalaryMaster
    {
        public static bool IsValidSalaryMasterId(int id)
        {
            var o = GetSalaryMasterById(id);
            return (o != null && o.IsDeleted != true);
        }

        public static SalaryMaster GetSalaryMasterById(int salaryId)
        {
            return Db.db.SalaryMasters.FirstOrDefault(i => i.Id == salaryId);
        }

        public static List<SimpleObject> GetSimpleSalaries()
        {
            return Db.db.SalaryMasters.Where(i => i.IsDeleted != true).OrderBy(i => i.DisplayOrder).Select(i => new SimpleObject() { Id = i.Id, NumberValue = i.Amount }).ToList();
        }

        public static List<SimpleObject> GetAllSimpleSalaries()
        {
            return Db.db.SalaryMasters.OrderBy(i => i.DisplayOrder).Select(i => new SimpleObject() { Id = i.Id, NumberValue = i.Amount }).ToList();
        }
    }

    public partial class ProvinceMaster
    {
        public static List<SimpleObject> GetSimpleProvinces()
        {
            return Db.db.ProvinceMasters.Where(i => i.IsDeleted != true).OrderBy(i => i.DisplayOrder).Select(i => new SimpleObject() { Id = i.Id, StringValue = i.Name }).ToList();
        }

        public static List<SimpleObject> GetAllSimpleProvinces()
        {
            return Db.db.ProvinceMasters.OrderBy(i => i.DisplayOrder).Select(i => new SimpleObject() { Id = i.Id, StringValue = i.Name }).ToList();
        }

        public static ProvinceMaster GetProvinceById(int id)
        {
            return Db.db.ProvinceMasters.FirstOrDefault(i => i.Id == id);
        }

        public static bool IsValidProvinceId(int id)
        {
            var o = GetProvinceById(id);
            return (o != null && o.IsDeleted != true);
        }

        public static List<SimpleObject> GetSimpleDistricts(int provinceId)
        {
            if (!IsValidProvinceId(provinceId))
            {
                return new List<SimpleObject>();
            }
            return Db.db.DistrictMasters.OrderBy(i => i.DisplayOrder).Where(i => i.ProvinceId == provinceId).Select(i => new SimpleObject() { Id = i.Id, StringValue = i.Name }).ToList();
        }

        public static List<SimpleObject> GetSimpleDistricts(int? provinceId)
        {
            if (provinceId.HasValue)
            {
                return Db.db.DistrictMasters.OrderBy(i => i.DisplayOrder).Where(i => i.ProvinceId == provinceId).Select(i => new SimpleObject() { Id = i.Id, StringValue = i.Name }).ToList();
            }
            return new List<SimpleObject>();
        }

        public static List<SimpleObject> GetSimpleDistricts(string provinceId)
        {
            List<SimpleObject> l = new List<SimpleObject>();
            int id;
            try
            {
                id = int.Parse(provinceId);
            }
            catch { return l; }
            return GetSimpleDistricts(id);
        }
    }

    public partial class DistrictMaster
    {
        public static DistrictMaster GetDistrictById(int id)
        {
            return Db.db.DistrictMasters.FirstOrDefault(i => i.Id == id);
        }

        public static bool IsValidDistrictId(int id)
        {
            var o = GetDistrictById(id);
            return (o != null && o.IsDeleted != true);
        }
    }

    public partial class UserProfile
    {
        [Display(Name = "Ngày sinh")]
        public string CustomDOB
        {
            get { return DOB != null ? DOB.Value.ToShortDateString() : null; }
            set { DOB = Config.StringToDateTime(value, Culture.Vietnames); }
        }
    }

    public partial class UserMaster
    {
        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Họ")]
        public string CustomLastName
        {
            get { return LastName; }
            set { LastName = value; }
        }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Tên")]
        public string CustomFirstName
        {
            get { return FirstName; }
            set { FirstName = value; }
        }

        public HttpPostedFileBase CustomImageFileName { get; set; }

        //===========================================//

        public string GetFullAddress
        {
            get
            {
                if (UserProfile == null)
                {
                    return "";
                }
                else
                {
                    string address = "";
                    address += (string.IsNullOrEmpty(UserProfile.HouseNumber) ? "" : ("(Số) " + UserProfile.HouseNumber));
                    address += (string.IsNullOrEmpty(UserProfile.Street) ? "" : ((string.IsNullOrEmpty(address) ? "" : ", (Đ.) ") + UserProfile.Street));
                    address += (string.IsNullOrEmpty(UserProfile.Ward) ? "" : ((string.IsNullOrEmpty(address) ? "" : ", (P.) ") + UserProfile.Ward));
                    address += (UserProfile.DistrictMaster == null ? "" : ((string.IsNullOrEmpty(address) ? "" : ", ") + UserProfile.DistrictMaster.Name));
                    address += (UserProfile.ProvinceMaster == null ? "" : ((string.IsNullOrEmpty(address) ? "" : ", ") + UserProfile.ProvinceMaster.Name));
                    return address;
                }
            }
        }

        //===========================================//

        public static void UpdateBasicInfo(UserMaster model)
        {
            UserMaster o = UserMaster.GetUserByUserName(model.UserName);
            o.LastName = model.LastName;
            o.FirstName = model.FirstName;
            o.UserProfile.Gender = model.UserProfile.Gender;
            o.UserProfile.DOB = model.UserProfile.DOB;
            o.UserProfile.AboutMe = model.UserProfile.AboutMe;
            o.UserProfile.FacebookPage = model.UserProfile.FacebookPage;
            o.UserProfile.GooglePlusPage = model.UserProfile.GooglePlusPage;
            o.UserProfile.Website = model.UserProfile.Website;
            o.UserProfile.MobiPhone = model.UserProfile.MobiPhone;
            o.UserProfile.University = model.UserProfile.University;
            o.UserProfile.HouseNumber = model.UserProfile.HouseNumber;
            o.UserProfile.Street = model.UserProfile.Street;
            o.UserProfile.Ward = model.UserProfile.Ward;
            o.UserProfile.ProvinceId = model.UserProfile.ProvinceId;
            o.UserProfile.DistrictId = model.UserProfile.DistrictId;
            o.UserProfile.ImageFileName = model.UserProfile.ImageFileName;
            o.UpdatedTime = DateTime.Now;
            Db.db.SaveChanges();
        }

        public static string GetUserType(string userType)
        {
            switch (userType)
            {
                case "1": return "Quản trị";
                case "2": return "Phụ huynh";
                case "3": return "Gia sư";
                default: return "";
            }
        }

        public static string GetUserType(int userId)
        {
            UserMaster o = GetUserById(userId);
            if (o != null)
            {
                return GetUserType(o.UserType);
            }
            return null;
        }

        public static List<UserMaster> GetUsers(string status)
        {
            if (status == "3")
            {
                return Db.db.UserMasters.Where(m => m.IsDeleted == true).ToList();
            }
            return Db.db.UserMasters.Where(m => m.Status == status && m.IsDeleted == false).ToList();
        }

        public static void LockUser(int userId)
        {
            UserMaster o = GetUserById(userId);
            if (o != null)
            {
                o.Status = "2";
                o.UpdatedTime = DateTime.Now;
                Db.db.SaveChanges();
            }
        }

        public static void UnLockUser(int userId)
        {
            UserMaster o = GetUserById(userId);
            if (o != null)
            {
                o.Status = "1";
                o.IsDeleted = false;
                o.UpdatedTime = DateTime.Now;
                Db.db.SaveChanges();
            }
        }

        public static void DeleteUser(int userId)
        {
            UserMaster o = GetUserById(userId);
            if (o != null)
            {
                o.IsDeleted = true;
                o.DeletedTime = DateTime.Now;
                o.UpdatedTime = DateTime.Now;
                Db.db.SaveChanges();
            }
        }

        public static void UnDeleteUser(int userId)
        {
            UserMaster o = GetUserById(userId);
            if (o != null)
            {

                o.IsDeleted = false;
                o.UpdatedTime = DateTime.Now;
                Db.db.SaveChanges();
            }
        }

        public static bool IsUnconfirmedUser(string userName)
        {
            return (GetUserStatus(userName) == "0");
        }

        public static string GetUserStatus(string userName)
        {
            UserMaster o = GetUserByUserName(userName);
            return (o != null ? o.Status : null);
        }

        public static bool ChangePassword(string userName, string currentPassword, string newPassword)
        {
            UserMaster o = GetUserByUserName(userName);
            if (o == null || (o != null && o.Password != EncryptPassword(currentPassword)))
            {
                return false;
            }
            o.Password = EncryptPassword(newPassword);
            o.UpdatedTime = DateTime.Now;
            Db.db.SaveChanges();
            return true;
        }

        public static bool ActiveByConfirmToken(string confirmToken)
        {
            UserMaster o = GetUserByConfirmToken(confirmToken);
            if (o != null)
            {
                o.Status = "1";
                o.ConfirmToken = null;
                o.UpdatedTime = DateTime.Now;
                Db.db.SaveChanges();
                return true;
            }
            return false;
        }

        public static string ResetPasswordByToken(string confirmToken)
        {
            UserMaster o = GetUserByResetPasswordToken(confirmToken);
            if (o != null)
            {
                string newPassword = o.ResetPasswordToken;
                o.Password = EncryptPassword(newPassword);
                o.ResetPasswordToken = null;
                o.ResetPasswordExpired = null;
                o.UpdatedTime = DateTime.Now;
                Db.db.SaveChanges();
                return newPassword;
            }
            return null;
        }

        public static bool IsInRole(string userName, string userRole)
        {
            UserMaster o = GetUserByUserName(userName);
            if (o != null && o.UserType == userRole)
            {
                return true;
            }
            return false;
        }

        public static UserMaster GetUserByUserName(string userName)
        {
            return Db.db.UserMasters.FirstOrDefault(i => i.UserName == userName);
        }

        public static UserMaster GetUserById(int userId)
        {
            var o = Db.db.UserMasters.FirstOrDefault(i => i.Id == userId);
            return o;
        }

        public static UserMaster GetUserByConfirmToken(string confirmToken)
        {
            return Db.db.UserMasters.FirstOrDefault(i => i.ConfirmToken == confirmToken);
        }

        public static UserMaster GetUserByResetPasswordToken(string confirmToken)
        {
            return Db.db.UserMasters.FirstOrDefault(i => i.ResetPasswordToken == confirmToken && i.ResetPasswordExpired >= DateTime.Now);
        }

        public static UserMaster GetUserByEmail(string email)
        {
            return Db.db.UserMasters.FirstOrDefault(i => i.Email == email);
        }

        public static bool ValidateUserByProvider(string provider, string providerUserId)
        {
            UserMaster o = null;
            switch (provider.ToLower())
            {
                case "google": o = Db.db.UserMasters.FirstOrDefault(i => i.GoogleOpenId == providerUserId && i.Status == "1" && i.IsDeleted == false);
                    break;
                case "yahoo": o = Db.db.UserMasters.FirstOrDefault(i => i.YahooOpenId == providerUserId && i.Status == "1" && i.IsDeleted == false);
                    break;
                case "facebook": o = Db.db.UserMasters.FirstOrDefault(i => i.FacebookOpenId == providerUserId && i.Status == "1" && i.IsDeleted == false);
                    break;
                default:
                    break;
            }
            return (o != null);
        }

        public static UserMaster GetUserByProvider(string provider, string providerUserId)
        {
            UserMaster o = null;
            switch (provider.ToLower())
            {
                case "google": o = Db.db.UserMasters.FirstOrDefault(i => i.GoogleOpenId == providerUserId);
                    break;
                case "yahoo": o = Db.db.UserMasters.FirstOrDefault(i => i.YahooOpenId == providerUserId);
                    break;
                case "facebook": o = Db.db.UserMasters.FirstOrDefault(i => i.FacebookOpenId == providerUserId);
                    break;
                default:
                    break;
            }
            return o;
        }

        public static string EncryptPassword(string password)
        {
            string encryptedPassword = FormsAuthentication.HashPasswordForStoringInConfigFile(password, "SHA1");
            return encryptedPassword;
        }

        public static bool ValidateUser(string userName, string password)
        {
            string encryptedPassword = EncryptPassword(password);
            var o = Db.db.UserMasters.FirstOrDefault(i => i.UserName == userName && i.Password == encryptedPassword && i.Status == "1" && i.IsDeleted == false);
            return (o != null);
        }

        public static bool CheckUser(string userName, string password)
        {
            string encryptedPassword = EncryptPassword(password);
            var o = Db.db.UserMasters.FirstOrDefault(i => i.UserName == userName && i.Password == encryptedPassword);
            return (o != null);
        }

        public static bool ExistUserName(string userName)
        {
            return (GetUserByUserName(userName) != null);
        }

        public static bool ExistEmail(string email)
        {
            return (GetUserByEmail(email) != null);
        }

        public static UserMaster CreateUser(string email, string userName, string provider, string providerUserId, string password, string userType, string status, string confirmToken, out MembershipCreateStatus createStatus)
        {
            if (ExistUserName(userName))
            {
                createStatus = MembershipCreateStatus.DuplicateUserName;
                return null;
            }
            if (Config.GetRequireUniqueEmail() && ExistEmail(email))
            {
                createStatus = MembershipCreateStatus.DuplicateEmail;
                return null;
            }
            UserMaster o = new UserMaster();

            o.Email = email;
            o.UserName = userName;
            string encryptedPassword = EncryptPassword(password);
            o.Password = encryptedPassword;
            o.UserType = userType;
            o.Status = status;
            o.CreatedTime = DateTime.Now;
            o.UpdatedTime = o.CreatedTime;
            o.IsDeleted = false;

            if (!string.IsNullOrEmpty(provider))
            {
                switch (provider.ToLower())
                {
                    case "google": o.GoogleOpenId = providerUserId;
                        break;
                    case "yahoo": o.YahooOpenId = providerUserId;
                        break;
                    case "facebook": o.FacebookOpenId = providerUserId;
                        break;
                    default:
                        break;
                }
            }

            if (!string.IsNullOrEmpty(confirmToken))
            {
                o.ConfirmToken = confirmToken;
            }

            UserProfile profile = new UserProfile();
            profile.CreatedTime = DateTime.Now;
            profile.UpdatedTime = profile.CreatedTime;
            profile.IsDeleted = false;
            o.UserProfile = profile;

            Db.db.UserMasters.AddObject(o);
            Db.db.SaveChanges();
            createStatus = MembershipCreateStatus.Success;
            return o;
        }
    }

    public class ChangePasswordModel
    {
        [Required(ErrorMessage = "{0} không được rỗng.")]
        [DataType(DataType.Password)]
        [Display(Name = "Mật khẩu hiện tại")]
        public string OldPassword { get; set; }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [StringLength(100, ErrorMessage = "{0} phải có ít nhất {2} ký tự.", MinimumLength = 6)]
        [DataType(DataType.Password)]
        [Display(Name = "Mật khẩu mới")]
        public string NewPassword { get; set; }

        [DataType(DataType.Password)]
        [Display(Name = "Nhập lại mật khẩu mới")]
        [Compare("NewPassword", ErrorMessage = "Mật khẩu nhập lại không khớp với mật khẩu mới.")]
        public string ConfirmPassword { get; set; }
    }

    public class LoginModel
    {
        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Tài khoản")]
        public string UserName { get; set; }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [DataType(DataType.Password)]
        [Display(Name = "Mật khẩu")]
        public string Password { get; set; }

        [Display(Name = "Ghi nhớ?")]
        public bool RememberMe { get; set; }
    }

    public class RegisterModel
    {
        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Tên tài khoản")]
        public string UserName { get; set; }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [RegularExpression(@"^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$", ErrorMessage = "{0} không đúng.")]
        [DataType(DataType.EmailAddress)]
        [Display(Name = "E-mail")]
        public string Email { get; set; }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [StringLength(100, ErrorMessage = "{0} phải có ít nhất {2} ký tự.", MinimumLength = 6)]
        [DataType(DataType.Password)]
        [Display(Name = "Mật khẩu")]
        public string Password { get; set; }

        [DataType(DataType.Password)]
        [Display(Name = "Nhập lại mật khẩu")]
        [Compare("Password", ErrorMessage = "Mật khẩu nhập lại không trùng khớp.")]
        public string ConfirmPassword { get; set; }

        public string Provider { get; set; }

        public string ProviderUserId { get; set; }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Loại tài khoản")]
        public string UserType { get; set; }
    }

    public class ContactModel
    {
        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Họ và tên")]
        public string FullName { get; set; }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [RegularExpression(@"^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$", ErrorMessage = "{0} không đúng.")]
        [DataType(DataType.EmailAddress)]
        [Display(Name = "E-mail")]
        public string Email { get; set; }

        [Display(Name = "Điện thoại")]
        public string Phone { get; set; }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Tiêu đề")]
        public string Title { get; set; }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Nội dung")]
        public string Content { get; set; }
    }

    public class ConfirmModel
    {
        [Required(ErrorMessage = "{0} không được rỗng.")]
        [RegularExpression(@"^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$", ErrorMessage = "{0} không đúng.")]
        [DataType(DataType.EmailAddress)]
        [Display(Name = "E-mail")]
        public string Email { get; set; }
    }

    public class Db
    {
        public static MYTUTOREntities db = new MYTUTOREntities();
    }

    public class SimpleObject
    {
        public int Id { get; set; }

        public string StringValue { get; set; }

        public int? NumberValue { get; set; }

        public SimpleObject()
        {

        }

        public SimpleObject(int id, string stringValue, int? numberValue)
        {
            Id = id;
            StringValue = stringValue;
            NumberValue = numberValue;
        }

        public override string ToString()
        {
            return string.Format("{0}|{1}", Id, StringValue);
        }
    }

    public class AdminAuthorizeAttribute : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                filterContext.Result = new HttpUnauthorizedResult();
            }
            else if (!UserMaster.IsInRole(filterContext.HttpContext.User.Identity.Name, "1"))
            {
                throw new UnauthorizedAccessException();
            }
        }
    }

    public class NonAuthorizeAttribute : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            if (filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                filterContext.Result = new RedirectResult("/");
            }
        }
    }

    public enum Culture
    {
        Vietnames,
        English
    }

    public class Config
    {
        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Loại hình tổ chức")]
        public string PreSiteName { get; set; }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Tên trang web:")]
        public string SiteName { get; set; }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Tên chi nhánh 1")]
        public string ContactName01 { get; set; }

        [Display(Name = "Tên chi nhánh 2")]
        public string ContactName02 { get; set; }

        [Display(Name = "Tên chi nhánh 3")]
        public string ContactName03 { get; set; }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Địa chỉ chi nhánh 1")]
        public string ContactAddress01 { get; set; }

        [Display(Name = "Địa chỉ chi nhánh 2")]
        public string ContactAddress02 { get; set; }

        [Display(Name = "Địa chỉ chi nhánh 3")]
        public string ContactAddress03 { get; set; }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Điện thoại chi nhánh 1")]
        public string ContactPhone01 { get; set; }

        [Display(Name = "Điện thoại chi nhánh 2")]
        public string ContactPhone02 { get; set; }

        [Display(Name = "Điện thoại chi nhánh 3")]
        public string ContactPhone03 { get; set; }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "YahooIM chi nhánh 1")]
        public string ContactYahoo01 { get; set; }

        [Display(Name = "YahooIM chi nhánh 2")]
        public string ContactYahoo02 { get; set; }

        [Display(Name = "YahooIM chi nhánh 3")]
        public string ContactYahoo03 { get; set; }

        //---

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Địa chỉ máy chủ webmail")]
        public string SmtpServer { get; set; }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Tên tài khoản máy chủ webmail")]
        public string SmtpServerUserName { get; set; }

        [Display(Name = "Mật khẩu máy chủ webmail")]
        public string SmtpServerPassword { get; set; }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [RegularExpression(@"^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$", ErrorMessage = "{0} không đúng.")]
        [DataType(DataType.EmailAddress)]
        [Display(Name = "Địa chỉ email gởi tin")]
        public string SmtpServerFrom { get; set; }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [RegularExpression(@"^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$", ErrorMessage = "{0} không đúng.")]
        [DataType(DataType.EmailAddress)]
        [Display(Name = "Địa chỉ email nhận tin")]
        public string SmtpServerTo { get; set; }

        //---

        [Required(ErrorMessage = "Việc quy định {0} không được rỗng.")]
        [Display(Name = "Phải xác nhận email khi đăng ký")]
        public bool RequireEmailConfirmation { get; set; }

        //--

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Số gia sư hiển thị trên trang chủ")]
        public int NumOfTopTutors { get; set; }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Số lớp học hiển thị trên trang chủ")]
        public int NumOfTopClasses { get; set; }

        //--

        [Required(ErrorMessage = "Việc quy định có hay không {0} không được rỗng.")]
        [Display(Name = "Slide (Trượt) các quảng cáo")]
        public bool SlideAdvertising { get; set; }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Thời gian chuyển giữa các quảng cáo (giây)")]
        public int SlideAdsInterval { get; set; }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Bước chuyển giữa các quảng cáo (pixel)")]
        public int SlideAdsStep { get; set; }

        [Required(ErrorMessage = "{0} không được rỗng.")]
        [Display(Name = "Giữ lại các quảng cáo không dùng")]
        public bool KeepOldAds { get; set; }

        //==================================================================//


        public static void SetupWebmail()
        {
            WebMail.SmtpServer = Config.GetSmtpServer();
            WebMail.EnableSsl = Config.GetSmtpServerEnableSsl();
            WebMail.UserName = Config.GetSmtpServerUserName();
            WebMail.Password = Config.GetSmtpServerPassword();
            WebMail.From = Config.GetSmtpServerFrom();
        }

        public static DateTime? StringToDateTime(string stringValue, Culture sourceCulture)
        {
            switch (sourceCulture)
            {
                case Culture.Vietnames: string[] dateFormats = { "d/M/yyyy", "dd/M/yyyy", "d/MM/yyyy", "dd/MM/yyyy", "d/M/yy", "dd/M/yy", "d/MM/yy", "dd/MM/yy" };
                    try
                    {
                        return DateTime.ParseExact(stringValue, dateFormats, CultureInfo.CurrentCulture, DateTimeStyles.None);
                    }
                    catch
                    { return null; }
                case Culture.English:
                    try
                    {
                        return DateTime.Parse(stringValue);
                    }
                    catch
                    { return null; }
                default: return null;
            }
        }

        public static string GetConfig(string key)
        {
            try
            {
                return ConfigurationManager.AppSettings[key];
            }
            catch
            {
                return null;
            }
        }

        public static bool SetConfig(string key, string value)
        {
            try
            {
                ConfigurationManager.AppSettings.Set(key, value);
                return true;
            }
            catch
            {
                return false;
            }
        }

        public static bool GetRequireEmailConfirmation()
        {
            return (GetConfig("RequireEmailConfirmation").ToLower() == bool.TrueString.ToLower());
        }

        public static bool GetSmtpServerEnableSsl()
        {
            return (GetConfig("SmtpServerEnableSsl").ToLower() == bool.TrueString.ToLower());
        }

        public static string GetSmtpServer()
        {
            return GetConfig("SmtpServer");
        }

        public static string GetSmtpServerUserName()
        {
            return GetConfig("SmtpServerUserName");
        }

        public static string GetSmtpServerPassword()
        {
            return GetConfig("SmtpServerPassword");
        }

        public static string GetSmtpServerFrom()
        {
            return GetConfig("SmtpServerFrom");
        }

        public static string GetSmtpServerTo()
        {
            return GetConfig("SmtpServerTo");
        }

        public static string GetPreSiteName()
        {
            return GetConfig("PreSiteName");
        }

        public static string GetSiteName()
        {
            return GetConfig("SiteName");
        }

        public static string GetFullSiteName()
        {
            return string.Concat(GetPreSiteName(), " ", GetSiteName());
        }

        public static bool GetRequireUniqueEmail()
        {
            return (GetConfig("RequireUniqueEmail").ToLower() == bool.TrueString.ToLower());
        }

        public static string GetContactPhone(string index)
        {
            return GetConfig("ContactPhone" + index);
        }

        public static string GetContactAddress(string index)
        {
            return GetConfig("ContactAddress" + index);
        }

        public static string GetContactYahoo(string index)
        {
            return GetConfig("ContactYahoo" + index);
        }

        public static string GetContactName(string index)
        {
            return GetConfig("ContactName" + index);
        }

        public static string GetCulture()
        {
            return GetConfig("Culture");
        }

        public static string GetRecaptchaPublicKey()
        {
            return GetConfig("RecaptchaPublicKey");
        }

        public static string GetRecaptchaPrivateKey()
        {
            return GetConfig("RecaptchaPrivateKey");
        }

        public static string GetFacebookConsumerKey()
        {
            return GetConfig("FacebookConsumerKey");
        }

        public static string GetFacebookConsumerSecret()
        {
            return GetConfig("FacebookConsumerSecret");
        }

        public static int GetNumOfTopTutors()
        {
            return int.Parse(GetConfig("NumOfTopTutors"));
        }

        public static int GetNumOfTopTutorsInRow()
        {
            return int.Parse(GetConfig("NumOfTopTutorsInRow"));
        }

        public static int GetNumOfTopClasses()
        {
            return int.Parse(GetConfig("NumOfTopClasses"));
        }

        public static int GetNumOfTopClassesInRow()
        {
            return int.Parse(GetConfig("NumOfTopClassesInRow"));
        }

        public static string GetDefaultTutorImageMale()
        {
            return GetConfig("DefaultTutorImageMale");
        }

        public static string GetDefaultTutorImageFemale()
        {
            return GetConfig("DefaultTutorImageFemale");
        }

        public static string GetDefaultProfileImageMale()
        {
            return GetConfig("DefaultProfileImageMale");
        }

        public static string GetDefaultProfileImageFemale()
        {
            return GetConfig("DefaultProfileImageFemale");
        }

        public static string GetDefaultNewsImage()
        {
            return GetConfig("DefaultNewsImage");
        }

        public static int GetPageSizeOfNews()
        {
            return int.Parse(GetConfig("PageSizeOfNews"));
        }

        public static int GetNumOfRelativeNews()
        {
            return int.Parse(GetConfig("NumOfRelativeNews"));
        }

        public static bool GetSlideAdvertising()
        {
            return (GetConfig("SlideAdvertising").ToLower() == bool.TrueString.ToLower());
        }

        public static int GetSlideAdsInterval()
        {
            return int.Parse(GetConfig("SlideAdsInterval"));
        }

        public static int GetSlideAdsStep()
        {
            return int.Parse(GetConfig("SlideAdsStep"));
        }

        public static int GetAdsWidth()
        {
            return int.Parse(GetConfig("AdsWidth"));
        }

        public static bool GetKeepOldAds()
        {
            return (GetConfig("KeepOldAds").ToLower() == bool.TrueString.ToLower());
        }

        //======================================================//

        public static bool SetRequireEmailConfirmation(string value)
        {
            return SetConfig("RequireEmailConfirmation", value);
        }

        public static bool SetSmtpServer(string value)
        {
            return SetConfig("SmtpServer", value);
        }

        public static bool SetSmtpServerUserName(string value)
        {
            return SetConfig("SmtpServerUserName", value);
        }

        public static bool SetSmtpServerPassword(string value)
        {
            return SetConfig("SmtpServerPassword", value);
        }

        public static bool SetSmtpServerFrom(string value)
        {
            return SetConfig("SmtpServerFrom", value);
        }

        public static bool SetSmtpServerTo(string value)
        {
            return SetConfig("SmtpServerTo", value);
        }

        public static bool SetPreSiteName(string value)
        {
            return SetConfig("PreSiteName", value);
        }

        public static bool SetSiteName(string value)
        {
            return SetConfig("SiteName", value);
        }

        public static bool SetContactPhone(string index, string value)
        {
            return SetConfig("ContactPhone" + index, value);
        }

        public static bool SetContactAddress(string index, string value)
        {
            return SetConfig("ContactAddress" + index, value);
        }

        public static bool SetContactYahoo(string index, string value)
        {
            return SetConfig("ContactYahoo" + index, value);
        }

        public static bool SetContactName(string index, string value)
        {
            return SetConfig("ContactName" + index, value);
        }

        public static bool SetNumOfTopTutors(string value)
        {
            return SetConfig("NumOfTopTutors", value);
        }

        public static bool SetNumOfTopClasses(string value)
        {
            return SetConfig("NumOfTopClasses", value);
        }

        public static bool SetSlideAdvertising(string value)
        {
            return SetConfig("SlideAdvertising", value);
        }

        public static bool SetSlideAdsInterval(string value)
        {
            return SetConfig("SlideAdsInterval", value);
        }

        public static bool SetSlideAdsStep(string value)
        {
            return SetConfig("SlideAdsStep", value);
        }

        public static bool SetAdsWidth(string value)
        {
            return SetConfig("AdsWidth", value);
        }

        public static bool SetKeepOldAds(string value)
        {
            return SetConfig("KeepOldAds", value);
        }
    }

    public partial class SearchModel
    {
        [Display(Name = "Mã số")]
        public int Id { get; set; }

        [Display(Name = "Lớp")]
        public int? Class { get; set; }

        [Display(Name = "Môn học")]
        public string Subjects { get; set; }

        [Display(Name = "Địa điểm")]
        public string Address { get; set; }

        [Display(Name = "Lương")]
        public int? Salary { get; set; }

        [Display(Name = "Thông tin thêm")]
        public string MoreInfo { get; set; }

        //=================================//

        public static string GetClass(int id, string type)
        {
            switch (type)
            {
                case "class": return Models.Class.GetClassById(id).ClassRequirement.ClassMaster.Name;
                case "tutor": return TutorClassFindingRequest.GetTutorClassFindingRequestById(id).GetClassesCanTeach;
                default: return "";
            }
        }

        public static string GetMoreInfo(int id, string type)
        {
            switch (type)
            {
                case "class": return Models.Class.GetClassById(id).GetShortRequiredTutorType;
                case "tutor": return TutorClassFindingRequest.GetTutorClassFindingRequestById(id).GetShortTutorType;
                default: return "";
            }
        }

        public static string GetMakeUpId(int id, string type)
        {
            switch (type)
            {
                case "class": return Models.Class.GetMakeUpId(id);
                case "tutor": return TutorClassFindingRequest.GetMakeUpId(id);
                default: return "";
            }
        }
    }
}